Goto can cause confusion but it's okay if used judiciously by an expert.
That is an interesting question, which experts don't agree on. Some people say that goto is always bad, and must never be used. Other people say that the "Knuth goto" (for error handling) is legitimate in languages that don't have structured error handling mechanisms; the folks in the former group say that even that use is bad and one should use if statements instead. I've not heard anyone (who is sane) say that any other use of goto is acceptable. This topic is debated in the software engineering community, although in the last 10 or 15 years, the first group seems to have won the debate. Personally, I have functioned in communities of either style, and I can adapt.
I have seen gotos in both the Linux and FreeBSD kernels.
Kernels are to some extent different from normal programs; some low-level and hardware-near programming can require unusual programming styles that should not be used otherwise. Both kernels are also quite old, and there is serious debate over the quality of the Linux kernel. Using them as a guideline for good software engineering practices is a bad idea.
Wasn't there some paper by someone opinionated called "Goto Considered Harmful"? I don't care what some randomer thinks.
It was Dijkstra. I wouldn't call him opinionated ... I would call him one of the greatest computer scientists and software engineers of all times. He is very much not a "randomer". But we need to understand that other very smart people (among them Knuth and Wirth) were on different sides of this debate.
to break out of multiple nested loops with a single keyword ( avoids a "flag" variable.
Some programming languages (like Java) introduced the concept of labeled loops, and then allow the break and continue statements to break out of specific loops. There is some debate whether this is a good or a bad thing though. Personally, I like it. But in many cases, this can be handled cleanly, without goto, and without flag variables. And if it can't be handled cleanly, then an explicit flag variable makes clear what is going on.
in a function that does multiple sequential operations, each of which can cause a memory/resource leak. It is desirable to have a single point at the end of the sequence, labeled "failure", which cleans up any resources, and jump to it with a goto. This keeps the cleanup simple and avoids repetition and the ugliness of cleaning up "inline".
That is the "Knuth goto". There are other ways of handling it, which are just as clean, and which don't require multiple copies of the cleanup code.
If I was advising a new programmer I'd say to learn Haskell. Much harder in the beginning but it teaches you good habits that you can then apply in any other language.
Interesting idea. Before we can give any explicit advice on what programming language to learn, we need to ask why the person wants to learn programming. Are they going to be a computer scientist? In that case, they will learn a lot of different programming languages anyway; and the skill they really need is not being great programmers, but understanding how computers and algorithms work. Are they going to be professional software engineers (which is very much not the same as a computer scientist)? Then they really need to learn other skills, such as OOA&D, engineering processes, QA and test, and several programming language. Most importantly, they need to learn good taste in the craft of programming (which is neither a science nor purely an engineering discipline, but at its core a craft). Are they going to be casual computer users, who need to occasionally program (like typical data scientists or economists, who need to be able to analyze data, but not build towering edifices of software)? Then they need something that's relatively easy to learn and use, since it is not their main focus. Very different requirements.
As far as I can see, most introductory programming classes today are done in Java or Python.