It's the only real solution if you need tens of thousands of concurrent tasks. Real threads use too much memory.
There are other options than async/await and threads.
In my heart that is my main objection to async/await in Rust. It has "poisoned the well" for asynchronous programming. Where people think it is async/await or threads
We have been doing asynchronous programming for many decades.