The reason for the rule is that jumping over an initialization leaves the object in an undefined state. When you get to the end of the function, destroying those uninitialized objects might not work.
One exception is obviously that
int i;
leaves the int
uninitialized anyway, so skipping that is just half bad.
If you want to leave a function early, a quick return
is an option to avoid the goto
.