By "maintain", he likely means that bandwidth to any particular server is constrained. Yes, you may be able to hold 10k connections open on your Wifi'd laptop, but if each connection only gets 1B/s is it really a useful webserver?
Any modern web server is going to be able to handle tons of connections, much more than a wifi laptop that can not yet be considered a modern web server. Beyond that, bandwidth is rarely the limiting factor. Framework/language weight, slow db queries, and javascript performance in the user's browser are much more prevalent concerns. In my experience it's always the db that falls over first, well before connection limits are reached.
Slow DB queries, yes. If your application does something stupid with SQL, your whole awesome C10K-solving epoll-based framework comes to a halt waiting for the database to read 1M rows off disk. Worst of all, your ORM likely hides the facts from you, producing left joins when you need inner ones, or worse not grouping the results so that a full join'ed result is returned when you only need the first and last tables.
More on topic, scaling web servers is not hard, just tedious. Scaling storage, especially if you need to use RDBMS's is the real trick.
If your application does something stupid with SQL, your whole awesome C10K-solving epoll-based framework comes to a halt waiting for the database to read 1M rows off disk.
No, a database connection is just another socket in your "awesome epoll-based framework".
Worst of all, your ORM likely hides the facts from you
Maybe if you're writing your app in BASIC? A good ORM doesn't hide the query logic from you, and there are plenty of popular languages that have good ORMs. The difference between using an ORM and not using an ORM is that you don't have a bunch of code to map SQL rows to application domain objects in your app. That's it.
(Note: Active Record and Class::DBI from 5 years ago aren't good ORMs. But people have written good ones in the intervening time, like DBIx::Class.)
To your first point, at least libmysqlclient blocks and any wrapper around it does too. To your second point, my most recent experience is with sqlalchemy, which is really pretty powerful, but also produces some hideous SQL when using the ORM layer. It does not hide the query logic from you, but conceals it just enough that I have to check every time that it is not lazy-loading 10,000 rows or not returning 10,000 rows when I only need 10.