“dns-prefetch” is basically a suggestion to the browser that it should consider prefetching that DNS lookup as soon as it’s practical to do so. Therefore, it won’t be a blocking action, and in general the browser (if doing things sanely) would not tie up the valuable bandwidth/connections pool during critical page load path with those “extra” DNS lookups, but would rather defer that work until the main resource loading is complete.
On the other hand, if your site has lots of different DNS items you are prefetching, I think you are definitely creating wasted bandwidth for the user (lots of mobile users are still on metered/limited bandwidth), as they are not likely to visit all those extra domains (maybe only 1 or 2 max). So I’d call it a “smell” if your markup had more than one or two at most of those prefetches listed explicitly.
Also, AFAIK, Chrome automatically prefetches even stuff it finds in the markup (and I imagine this is actually the future direction of most browsers, with implicit lookups rather than having to explicitly indicate). You can actually disable the DNS prefetching in this scenario, by sending an HTTP response header to tell Chrome not to do that. I have several sites I disable it on, because I know there may be many different hosts (like on a big blog post, for instance), and I don’t want to generate a lot of DNS noise unnecessarily.
One example where DNS prefetching can actually create lots of unnecessary DNS traffic to a server is if that server has wildcard (*.) DNS records, because they are not cacheable (or at least, they aren’t shared cacheable), so if you employ wildcard DNS records and you have many of them listed in a page, you may very well want to disable Chrome from automatically fetching all those records separately and hammering your DNS server.