Hi,
No debounce may very well be part of the problem but in THIS case I think the contact bounce is what actually makes it sort of "work".
The real issue, I believe, is that your "loops" looks for ModeFlag being equal to 1 and switches mode. But the flag is not being cleared. So, if you push the button once, the ISR sets the flag. If there are no bounce the flag will be set all the time and the program will keep cycling between the different modes since the flag is never cleared. That's a problem with the implementation.

What's more severe is that you're using GOSUB without a matching RETURN. What you want in this case is GOTO.

Make the ISR set (and only set) the ModeFlag, implement some debounce in the ISR.
In the main loop you check the ModeFlag and IF it's set you first clear it and then act accordingly (ie. jump to the next mode).

Also, there's no need to set the LED high or low 1000 times (ie do it inside the FOR_NEXT loop), one time is enough, I'd rewrite the loop like:
Code:
DO
    HIGH LED
    for loop1 = 1 to 1000
        pause 1    '1 ms
        IF ModeFlag = 1 THEN
          ModeFlag = 0
          GOTO Mode 2
        ENDIF    
     next loop1
    
    LOW LED 'led off
    for loop1 = 1 to 1000
        pause 1    '1 ms
        IF ModeFlag = 1 THEN
          ModeFlag = 0
          GOTO Mode 2
        ENDIF
    next loop1
LOOP
/Henrik.