La tua ipotesi che le variabili globali siano usate solo per lo stato non è corretta. In (probabilmente) le lingue più interpretate, ad esempio, gli spazi dei nomi sono usati per comunicare le interfacce. Poiché in molte di queste lingue le interfacce (enumerazioni, funzioni, classi) sono solo variabili, quindi senza variabili globali non ci saranno interfacce globali.
Inoltre, alcuni dei programmatori là fuori lavorano in ambienti vincolati come i sistemi embedded e le applicazioni real in tempo reale. In quegli ambienti in cui l'efficienza è soprattutto, si tende ad evitare pile profonde e cumuli pesanti. In quegli ambienti, la comunicazione su variabili globali è spesso l'opzione più efficiente.
Si noti che dal punto di vista teorico non può esserci un programma senza una sorta di variabili globali. Dopotutto, qualsiasi programma deve generare un output e il dispositivo di output è un handle globale. Lo stesso vale per tutte le altre interfacce di sistema come il tempo, le variabili di ambiente, ecc. Avere accesso a queste variabili solo attraverso getter e setter non le rende meno globali, solo meno visibili.
Un linguaggio di programmazione non dovrebbe infliggere una censura algoritmica. È uno strumento, ed è compito del programmatore usare questo strumento nel modo giusto.