You can bypass the type safety on pretty much any language that doesn't do runtime type checking - which imposes a massive performance overhead by C standards. General-purpose memory management similarly comes in two flavors: manual, or some sort of high-overhead garbage collector. The hardware of the time simply didn't have the available resources to be thrown away on such things - if you wanted them you had Simula and other such "toy" languages that offered nice features at the expense of being so slow you couldn't do any serious work on them.
I do agree that C++ would have benefited from removing some aspects of backward compatibility, or at least had standard compiler warnings available for "deprecated" C functionality. But had they broke backwards compatibility C++ would likely have never taken off - it rose to prominence in large part specifically because it was interoperable with the massive existing C codebase and libraries.
Besides, it's not like modern languages don't have huge holes of their own. I mean Java? Ugh, the performance penalties of having *every* damn thing be a pointer. And I cant even specify that my function definitely won't modify the parameters being passed to it! And how many people go to the trouble (and performance expense) of passing copies of large objects that absolutely must not be modified? "final Thing x" is only equivalent to C's "Thing * const x" - doesn't guarantee a thing as far as the calling context is concerned.