You don't need to code with "a bunch of labels and resource flags", though. There are most often good ways to clean up in a reasonable way. Even the simplistic malloc()/free() works with straight line code, just initialize to NULL and you can call free() without even checking that the resource was acquired. It's also often valid to not clean up at all because the OS cleans up after process exit.
And besides, if resources aren't released in the same function you'd need to come up with a different way to clean up anyway.
> There are most often good ways to clean up in a reasonable way.
Yes, and if a defer keyword were to be introduced in C, all these reasonable ways could still be used by anyone who wants to, while we could let the compiler handle it when we don't want to, making the source easier to read and reason about.
And besides, if resources aren't released in the same function you'd need to come up with a different way to clean up anyway.