having a timer from my experience, it delays things and then glitches happen, with a delay... but it depends on how you implement it, the solution 3 shouldn't create any delayed glitches.
have 1 boolean or global variable that u turn on and off while actions happen, and you have something like bellow:
Global Variable "checkF" = 0;
1. On "F" Key pressed
1.1 if checkF = 0 > action > set CheckF = 1
set checkF = 0
this will not let you tap super fast and overlap things but will create like a 0.1-0.2 delay in your spawning action when you press "F" it will still overlap but not as fast.
Global Variable "timer" = 0;
1. everytick (or if timer) > 0 >subtract from timer 1 (this happens everytick or dt, so is closed as being miliseconds and not seconds, to increase delay either increase 2.1 set timer to 1000 or set the value of subtraction to 0.2 or 0.1)
2. On "F" pressed
2.1 if timer =< 0 - action
set timer to 100 (in miliseconds if you subtract 1 everytick like we do above)
3. if timer < 0 - set timer to 0 [this is fail safe so the timer never goes under 0]