Depends what problem you're trying to solve. When we talk about a thread being blocked we're talking about two problems:
1. The thread is consuming resources/memory but it's not doing any useful work.
2. The thread is prevented from working on other tasks it might be responsible for.
Virtual threads can solve the first problem, but they don't address the second. A single virtual thread can still only do one thing at a time.
Plenty of the reasons for using coroutines fall into the second category rather than the first. And
runBlocking
itself can cause more problems in that same vein.