Having written frameworks in both blocking (http4k - kotlin) and non-blocking (fintrospect - scala) styles, I can sympathise - but for the vast majority of cases I'd argue that what really matters is the ability to develop and operate systems easily because compute is cheap and developer time is expensive. Traditional (Future-et-al based) async code has the downsides that the model tends to bleed into all aspects of your codebase, which increases complexity in both dev, test and maintenance for your entire app. Now the coroutine model does mitigate this to a certain degree (at least in the aspect of code style), but the underlying complexities still exist - they're just hidden and when issues occur then they may be as difficult to deal with.
Here's a story about Netflix that might be worth reading:
https://medium.com/netflix-techblog/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c
"While we did not see a significant efficiency benefit in migrating to async"
"We have a system that is much more complex to debug, code, and test"