Draw and update text in viewport without modal operator in blender
You don't need the modal operator to draw things to the viewport. Calling bpy.types.SpaceView3D.draw_handler_add is all you need. Instead of (self, context) you could pass an arbitray object and alter its attributes to modify the drawing. I.e.

class foo:
    def __init__(self, prop):
        self.prop = prop

def draw_text_callback(data):
    #...
    blf.draw(data.prop)

data = foo("Test")

handle = bpy.types.SpaceView3D.draw_handler_add(
           draw_text_callback, 
           (data,),
           'WINDOW', 'POST_PIXEL')