You have to understand why C is useful for low-level systems, its mainly because it offers a compromise between how the computer works, and how humans can understand the same. Assembler would be a better systems language, if us meatbags could understand it and be productive in it.
So the key is that the level of abstraction fits a sweet spot between not slowing things down from the computers perspective, and keeping things understandable from ours.
In keeping with this, a hypothetical new language would do exactly the same things as C, with as few abstractions.
There are some things that the compiler, or tools could help us with - though, note some tools like, say garbage collection, are useful to us and theoretically make the system work more efficiently, but in practice slow things down and make them unpredicatable and sometimes more difficult to work with. I can imagine the areas that an improved C would be RAII (I love this in C++, it is awesome, the compiler puts your de-allocation routines in where you would put them!), and a better string routines - making strings null delimited made sense when memory was very expensive, but in systems where we use 2 bytes per character, this limitation is no longer around. I'd have a string prefixed with a dword for length that should improve a lot of performance. Note I wouldn't go further than that - no referenced counting string classes or anything similar, and I probably wouldn't do "classes", though I would introduce some form of mini module that helps to encapsulate related code (and compiler-generated routines like for RAII).
You might want to have some memory location routines built in, that helps with CPU cache coherency, and maybe a primitive form of threading - not so people can abuse it by spawning off threads and locks willy-nilly, but so they have to think what they are doing.
I think the latter aspect is important in C, while we can add a load of features to make life easier for the programmer, they all introduce overhead, that gets compounded by people creating more abstractions using those abstractions where you end up with seriously in-efficient code, that people use because its "fast enough". Its never fast enough for low-level systems programming :)