In theory, if you scrapped libc and up, you could limit your "speaking C" to the kernel of whatever OS/architecture you're using. Different OS/architecture combos would be more of a nightmare than others, but we cheat off libc for that , except we have to do things to support multiple libc implementations some times.
It doesn't solve interop with other languages, because they don't want to reinvent wheels either.
In theory, you could scrap it all and go hardware up. Have a nice OS with a well defined message passing interface that any language could interact with. You could even make a libc wrapper on top to address portability. In 20 years, it may have serious adoption.
The problem is that the situation is "good enough" that nobody wants to solve it. That applies to most technical debt, and really any other human concern.