Controlling simultaneous access to a global resource from multiple threads, in itself, increases complexity. Of the functions controlling that access, at the least.
One common trap with multithreaded programming - which novices invariably run afoul of, without realising it - is that no object can protect itself from concurrent access. Something else (an object or a function at a higher level of abstraction) must protect the object.
The most complex programs I have seen did not have any global data (and, no, they did not use dynamic memory allocation after completing their startup/initialisation). Their complexity would have been increased, and their maintainability made more difficult, if they had made use of global data.
I see it more in amateur settings (such as people doing homework exercises). In an amateur setting I'll concede that simple programs can sometimes be made simpler by using global data rather than passing arguments. However, that principle does not scale to large programs.
Yes, it may take more typing to pass arguments to a function, or to specify data structures that can be used to supply non-trivial data as an argument to a function. But it is also harder to get a complex program running correctly when multiple functions make use of global data.