In the example you give I would argue that the use of the goto to traverse two blocks is indeed bad style.
Now the use of 'goto' generates all kinds of unwarrented hysteria but in this case the reason that it's bad style is very clear:
Readers of your code may reasonably expect that once an exception handler has been invoked, something really bad has happened that prevents the current code context from continuing.
If the ifstream is expected to exist and does not, this is an exceptional case and an exception is warranted.
However, if the attempt to open the stream is simply a test which could reasonably be expected to fail, then this is not an exceptional thing. In this case, don't use an exception at all.
Under these circumstances, a better way to express your intent might be like this:
for(/* usual stuff */)
while (!ifstream.open()) {
if (!attemptRemedialAction()) {
throw really_bad_thing_happened_exception;
}
}
// do things with ifstream,
// including goto statements if they express your intent elegantly
}
// allow the outer context or the caller to deal with the exceptional case of non-recovery