Change Blender's Preferences Dynamically
When registered to run on startup, it has the name of the module, in the case below ui_panel.py is a registered text.

if __name__ in ["__main__", "ui_panel"]:
    print("Running ", __name__)  # see the diff between reg or run script
    register()


The refresh (aka reload) script operator is, which IIRC is the operator called by hitting F8

bpy.ops.script.reload()


Instead of cancelling with

return {'CANCELLED'}


use

return self.cancel(context)


then append the operator call to your cancel method, (ie after removing the timer),.  

My preferred way of turning on and off modals is using the update method of a boolproperty

def start(self, context):
    if self.bgl_draw_speaker:
        bpy.ops.wm.draw_speaker_vis()

bpy.types.Scene.bgl_draw_speaker = BoolProperty(update=start,
                                                name="Draw Details",                                                    
                                                description="Show BGL Visualiser")


and have if not scene.bge_draw_speaker as a way to terminate the modal op.