All of our tags are always global scope.
ALL ???
Always ?
For tags that communicate with the HMI -- sure.
For one-shots, timers, holding registers, pointers and other controls -- Why ?
When I have 4 "identical" systems, I'll create one program, and in that program have a whole bunch of program scoped tags that are aliased to controller-scoped tags. For example: Pump_Start local tag is aliased to Pump1_Start global tag. Again, one-shots bits and the like remain local scoped. And not just so that I don't clutter up (make it harder to find) things in the Controller tag list.
Then, once I've got everything how I want it, I create the same tag names in each program, but aliased to different global tags (in the Pump2 program, Pump_Start local is aliased to Pump2_Start, and so on).
What this means is, if I make a change to one routine in one program, I can copy the entire routine from Pump1, paste it into Pump2, and the logic solve the same way, only for the different set of global tags.
No search/replace (which you can't do online anyway). Simple blind delete the old and paste the new. If it doesn't compile, it's because the new code has a local tag/alias that hasn't been created yet. Export/Import will do that for you, but requires care to make sure you do everything right.
Makes managing changes easy, because I'm not having to make the same change in 4 places, get interrupted half-way through, and then try to remember where I left off. Or make some stupid typo in one of them.
Obviously naming conventions and UDTs help a lot in doing this. If "Pump" aliases the "Pump1" UDT, then "Pump" has the same structure.
Just a suggestion.