If you think modern code is horrible spaghetti (I disagree, for the record), bear in mind that it would be considerably worse with indiscriminate use of goto.
Sure, code has complex code flow. When code is designed to solve complex problems, it's going to be complex. Complexity is okay. The key is being able to make complex code clear, readable, and less error-prone. Goto is less clear and readable because it's not obvious what a goto statement is meant to do. When you see a while loop, or a break statement, or a function call, you can get an idea of what it's doing just by the nature of what statement is being used. Goto can be used to cover any of those cases, so it's more difficult to follow. Because of this, it's also easier to make a difficult-to-debug mistake!
99% of the time, when you could use a goto statement in code, there is another, better way of doing the same thing. An expert coder will be able to effectively use it in a way that limits the risk, but for a novice or intermediate coder, or even many experienced ones, it is much easier to muck everything up using goto vs. using other control flow tools.