For triggers you should only destroy them once you know you will never need to run them again. Once the trigger is destroyed, it won't work again unless you dynamically re-create it.
If you trigger just is one time event, you can put that line as the very last statement in the action.
e.g.
JASS:
function main takes nothing returns nothing
//your code here
...
//now destroy the trigger
call DestroyTrigger(GetTriggeringTrigger())
endfunction
Alternatively, if the trigger is stored in a global trigger variable, then you can destroy it any time, but once you do, that trigger is gone for good.
In order to remove rects, you can just call
Note again, once you do that, myRect won't work for any functions that use rects as it no longer exists.
In general, unless you have heavy optimization concerns, having a few leaks here and there won't cause any difference. What is really important is when you have functions that generate local handles, that those handles must be destroyed/reclaimed at some point, otherwise WC3 will progressively use more and more memory, until the map is unplayable.
It doesn't appear you are dynamically generating triggers or rects, so I wouldn't lose much sleep over this.