I think you are missing an understanding of how coroutines work, and
what they can do for your code structure.
One rough analogy is that coroutines are to threads what cooperative
multitasking is to pre-emptive multitasking. Clearly, pre-emptive
multitasking and threads have their advantages for many uses - they can
be prioritised automatically, they can run in parallel on different
cores, and they stop bad processes from blocking the system. But
cooperative has its advantages too. They are much easier for
synchronisation and access to shared data - /you/ decide where tasks
block and other tasks can take over, eliminating all sorts of locking
and atomicity issues. They are lightweight, flexible, easy to
understand, and easy (or easier) to debug.
In comparison to asynchronous processes with callbacks, they are easier
to write and clearer to read, while maintaining the lightweight
features. A clear indication is what you see when you write the code.
With asynchronous processes with callbacks, you often see a code
structure of a function call with a lambda, which contains a function
call with a lambda, and so on - a new level of indentation for every
step. Your code is one statement - a single function call - that spans
perhaps dozens of lines of highly indented source code. The equivalent
written using coroutines will look like normal, sequential code, and can
contain whatever mix of statements, declarations, comments, etc., that
you like.
So I am looking forward to coroutines. I think it will take a while for
support to mature and be efficient in compilers, but it will give us a
new way to structure code.
Other than that, in C++20 I look forward to concepts and modules. The
spaceship operator will simplify some kinds of classes. Then there are
lots of small but nice features - more constexpr, consteval, etc.
Ranges are another big feature - I don't know quite how well that will
work out, but it is certainly interesting.