Programs are executed line by line. The main loop can't continue until the subroutine returns so the answer is no, you don't need the frame limiting code in the subroutine also. It behaves exactly as if you'd in-lined the subroutine:
Hope that helps clear things up a bit.
;graphics3d 800,600,16 ;;; create global variables ;;;etc ;;; ;; While not key down(0) if time<600 time=time +1 endif ;other gosubs ;frame limiting code end while .othergosubs return
Hope that helps clear things up a bit.