Pre-await Tokio code looks way worse to me.
In my experience, closure-based async programming is only sufficiently painless in managed languages to be worth using. When you're dealing with manual memory management (or, rather, smart pointer memory management), you spend a lot more time trying to make the captures hold onto stuff.
One of the key reasons for shipping async/await is that it erases almost all of this difficulty and lets you write straight-line code again.