So bottom line is that no matter which way you try to do the userspace emulation, some parts are going to be ring0, and thus the answer to your question is indeed yes.
If C++ would have cleaned up legacy, Rust wouldn't need to exist for ex.
Java has long had a policy of never breaking BC, but few years ago they started marking packages deprecated for removal. They're very slow and systematic about it, as they should be, but the point is, eventually those packages will be removed. And that's good. It means Java has a future.
Rust is a famous example; there's also Carbon[1] and cppfront[2].
Even so, this may be a controversial opinion, but with C++20, it has become fairly straightforward to program relatively safely and avoid some old footguns.
I recently wrote a server-client framework from scratch and used protobuf for messaging. The server is heavily multi-threaded with a lot of complex asynchronous rules, and there are no issues. If anything, I would hope for more concurrency primitives, as the C++ standard library is very high quality, and I would like concurrent hash maps and such.
Maybe that works for some new codebases.
When you need to integrate with other code, you can't necessarily understand the code semantics without knowing a lot more of the spec.
Also, I challenge any normal programmer to remember all of the "good" C++ rules regarding overload resolution in an arbitrary context.
I mostly design and create new products but on some occasions I've had situations like this. There was not a single time that quick Google search and now ChatGPT did not shed the light.
>"Also, I challenge any normal programmer to remember all of the "good" C++ rules regarding overload resolution in an arbitrary context."
Knowing / remembering every nook and cranny does not make for a good programmer (except language experts who write standard libraries and design / implement language itself of course). There are way more important things to consider.
To make your life easier? The customers may have totally different opinion.