That totally makes sense if you always have to cleanup. Most of us work in languages that compile a deliverable that executes in a runtime that takes care of that for us. For example, in C# a filestream object implements the IDisposable interface, which has a method, Dispose, that closes the stream and releases resources. Using the stream in a using block would ensure that cleanup occurred before exiting the function. What you're describing is the primary reason people moved away from C altogether.
It seems that the industry abandoned the single return best practice about the same time that managed code and garbage collectors became prevalent.
In your example, the code logic is pretty simple. If there was more code in each block it may take up more of the screen and become more difficult to follow when nested. This, of course, is subjective, but you are losing the battle of opinions.