O_o
Global variables aren't the same as global state.
Global variables increase coupling, may pollute the global scope, can have weird construction order problems, and you have very limited control over how the data those variables represent is used.
Global state is simply some data that can be access from anywhere in code; it may not have any of those problems.
There are issues with global state, but that applies to any form global state including actual global variables, singletons, and other techniques. (The singleton pattern alone doesn't solve this problem; it would need to be combined with other techniques.)
You can absolutely avoid global variables.
You can't really avoid global state, but by wrapping it with some technique or another you can solve the problems of actual global variables.
And this being C++ we are talking about, you can also get the best features of global state without forcing global state on client code in the form of overloaded or default parameter values referencing global state.
[Edit]
Code:
void DoSomething
(
int fSomeData
, int * fOtherData = GetGlobalData()
);
[/Edit]
Soma