What happens when IIS runs out of threads?
Without async code, it queues of requests and users sit there getting nothing from your server.
With async code, that's not the case! Well, until you reach the limit of what async code does, but that limit is quite high.
Typically a request thread that ends up blocking on I/O in some way (like accessing a database) sits there doing absolutely nothing for a very long time. The time it takes to get data from a database could be spent servicing many, many more requests! Async does just that. And before you ask, it doesn't spawn off any threads ... it leverages the asynchronous nature of the operating system to service I/O requests. It's actually really, really rad.
> Usually seems to be a premature optimization
If you have a user-facing system, it's most definitely not a premature optimization. If you know, for a fact, that you'll never need to worry about responsiveness, they're not worth it.