If you have them in your language the common better solutions to those use cases include:
1. Labeled loop control
2. Exceptions
PHP has #2 and a bad form of #1. In PHP you get to say how many loops to break out of, but not the name of the loop to go to. This makes code less self-documenting and can be fragile when editing code.
Other uses of goto for which substitutes are harder to find are to to make your language a more convenient compilation target, and when interacting with other control structures not under your control. These uses are VERY rare. In a decade of professional Perl programming I have seen each used twice. None of the examples were in any code base I worked with. Two were in the Perl core, the first is that the s2p utility emits gotos to emulate branches in sed, and the second is that the original Switch.pm used a goto to break out of any loops that it happened to interact with. (That one was a computed goto! After all he didn't know how this switch might interact with other switches.)
I would be willing to use goto for nested loops in PHP, but only because PHP does not offer labeled loop control. While I like to believe that I understand when to use goto for other reasons, I doubt I'll ever encounter a serious need to do that in any language.
Third example: Writing a Python-style generator in a language that doesn't have it. There's a trivial rewrite using gotos that means you mostly get the same logic, but you need goto.
I think I've used that twice in 10 years, but when you need it, you need it. At the cost of uglying up one function you can clean up tens or hundreds of invocation points, each of which involves duplicate (and hard-to-factor-out without-this-trick) logic. (This is the trick to factoring it out.) I'll pay that gladly.
Break 3 is really unclear about where it's going to take you, especially if the code is poorly formatted, and doubly especially if you decide later that you want change the code and put another loop in it.