Your friend is ignorant. Goto is a powerful-but-dangerous tool that should be used with extreme caution, if at all. However, to say that it's the mark of a bad programmer is insanely ignorant. It is often the mark of a bad programmer, but it can also be the mark of an exceptionally good one. The key is in knowing when you use it and when not to.
If your friend thinks he's a better programmer than Donald Knuth, then he's almost certainly suffering from the Dunning-Kruger effect. If he hasn't read Knuth's "Structured Programming with Gotos" (a direct response to Wirth's original "Goto Considered Harmful" paper), then he's not qualified to opine on the subject.
That said, probably 90% of the time (if not more), your friend will be correct. In the last over-a-decade, I've used goto once. And that lone case was after nearly a dozen attempts to find a way to around it that wasn't worse. I don't like gotos, and feel a little dirty that I ended up using it even that once. (If I'd been working in C++ or Java or Python, I would have used an exception, but I was writing in C.) A goto usually makes your code more difficult to read, and more fragile, and you should never use one unless you can prove the alternatives are worse. Which probably takes a lot more expertise than it sounds like you currently have, so avoiding them completely is probably the best plan for now. For you.