Early x86 were also tuned more for assembler than C, and C compilers sucked (and BASIC was a joke of myriad subroutines; but a scripting language, pasted into an EXE if you had the compiler). Both are quite good together, and modern (post-386) optimization is all about managing caches.
OS overhead is quite small for the most part. Heck, even if it were a mere 1%, that's still a huge amount of computation available.
Tim