I haven't used a goto in a high level language since BASIC with line numbers was a thing. I also tend to avoid returning from a function prematurely. I even make efforts to try to avoid 'continue' and 'break' inside loops. Those last points are more of a value judgement, if it's going to make things more convoluted and less readable by avoiding them, then I go for the most maintainable solution. It is rare though to see a return other than at the end of a function, or a break within a loop, and even more rare a continue in my code (I can't remember the last time I used continue).
While I'm not particularly dictatorial about it to others, my own C code follows a few different methods for dealing with exceptions, depending on the complexity and scenario, but I always use braces for single line blocks, and always consistently follow the same white space/indent methodology. At this stage in my career, and being a one man band mostly working on my own projects, I almost always get to decide how to write code. I realise not everyone has that luxury.
I have little trouble reading others' code in whatever format they choose, as long as it's well laid out and consistent. Frankly IMHO if you get upset reading someone else's reasonably formatted and structured code, then you need to practice more!
One of the nice things about lower level headless embedded stuff (about 70% of what I do programming-wise) is that a good deal of errors are fatal, and generally you will avoid memory and resource allocation errors as everything tends to be statically allocated. Catching all errors is good practice in the debugging cycle, even if it simply generates a CPU exception where you can figure out where it was generated. In a finished retail product, a good deal of the time you should never get there.
Dealing with the OP, within the scope of a medium to complex function, I include an initialised local "rc" variable (Return Code, often set up as an a global enumerated typedef) and test rc at each functional block in the function. Also at function scope I'm likely to have a selection of handles and pointers, that are initialised to null, but are subsequently set up as the function progresses; alternatively they may be within a structure passed by reference to the function.
At the end of the function, just prior to returning, if rc contains an error, I deallocate/dispose/terminate/reset any allocated resources by testing each of the handle and pointer values that were set in the reverse order they were allocated. I also reset to null/invalid each handle and pointer as they're deallocated/terminated etc. The rc is then returned to the caller, and that can choose to do its own error handling based on that.