`goto`s make for bad, error prone, and hard to follow/read code.
Replacing these improves the overall code quality and makes it easier to
follow/read.
In this case, there are numerous `gotos` that share the exact same label `error`. This name is also shared with variable names further complicating the code. In addition, having to scroll back and forth between the `error` label and its associated `goto` makes reading the code more difficult, especially with all the instances of `error` that occur in this file. Finally, the code following the `error` labels can be refactored to or are only 1-2 lines of code while removing unnecessary variables.