Good to hear that you had success that way. However, this doesn't necessarily solve all cases discussed here. Also, throwing more moving parts at a problem increases complexity. Mileage varies.
In this case, there is an immediate solution to the problem at hand in Ktor. As the
ticket status shows, it is being worked on just now.
The underlying cause, of course, is blocking I/O (including network I/O and all sorts of databases). With a true coroutines-based I/O solution, there would be no need to fire up an excessive number of threads, which are consuming resources, but mostly sleeping. So once you have that option, it would be the ideal way to scale up easily and efficiently.