You can use only one static group never destroyed, as long you only need to enum units instantly, and don't need them during time.
Usually, we use a GroupEnum + a null filter, and then a FirstOfGroup/GroupRemoveUnit loop :
JASS:
local unit u
call GroupEnum...(YOUR_STATIC_GROUP,null)
loop
set u = FirstOfGroup(YOUR_STATIC_GROUP)
exitwhen u == null
// do your stuff here with u
endloop
In case of triggered spells, you would probably remove the caster from the group before remove it (no need to check if it was inside or not).
The reason why we use a null filter (which is equal to a function which takes nothing and returns true) instead of using a "valid" filter, is because it's more efficient, and it doesn't split your code, so you don't have to use temp globals variables, you can keep your locals.
It is more efficient because each enum with a not null filter opens a new thread.
Now, if you need to keep units during time, you have to use several groups, or your own structure, like
here.
EDIT : If you use the newest jasshelper by cohadar, you have a nicer loop for that.
(Read the first post of my resource it explains some interesting things)
Also instead of create/destroy groups you can recycle them, but i'm not sure it worths it.
And finally, i have never heard about a permanent leak about destroying groups if it's done properly, however i didn't test it.