for me it depends upon the problem. but i use global variable as a last resort because if you are in a huge project (lots of C files and header files), it will be difficult to debug if too many functions access the variable and sometimes can lead to accidental writes. and also, as far as i know, global variables can take up the RAM as long as the program is running, and as long as the compiler doesnt create it as ROMable variables(some C compilers do support it).
also it will be more efficient to pass the address specially when using huge array size to be passed/used on functions. also it is more efficient to use pointers especially in strings for example:
char a[5][5]={"test","hey","go","best","win"};
it will be better to write:
char *a[5]={"test","hey","go","best","win"};