By Derakon's response, I see a clear use for a global variable: a commonly read state value, changed rarely, and possibly through a function to aid in debugging.
From my own experience, I know that a semi-global varialbe is very useful (global to a file but not used elsewhere at all) because you have a group of functions sharing data and using global variables would be bothe the most efficient and the most clear way.
Finally, there is set once variables such as a pointer to a class or struct.
Also, static variables in languages without MUST be global to work.
{Theory}
I believe that the older games(NES and similar) don't crash often because they don't use pointers or use the stack for functions. They would use stuff *like* a pointer, but not quite(array, basically), and this is my personal belief of how the pokemon red/blue missingno thing works(one after the last pokemon in memory, an array index bounds error, maybe turned feature? Original source of removed content?) and NES metroid secret worlds(Theoretically, could you find a level cell, normally unreachable, that varies with your health?)
{/theory}
But overall, globals aren't bad at all, it's just misuse in large projects where the overhead of function-access is minimal. Write-rarely, read-often, global variables are quite useful, especially in small projects.