I find the developer experience is quite different. Which is actually quite important. In the async runtimes I am familiar with I find managing shared resources and locking much easier.
But maybe I'm missing something here. Do you know of an async runtime and a threaded runtime that do not have significant differences?
Take boost.asio: it is a generic event loop (that can run on one or more OS threads): on top of asio you can run old school manual continuation passing code, promise/future based code, async code using C++20 coroutines (or a macro hack), or more classically multithreaded code using boost.context. You can write the same logical code in any style and the transformation is fairly mechanical.
But maybe I'm missing something here. Do you know of an async runtime and a threaded runtime that do not have significant differences?