Is there a way to redo modal arguments?
BMesh Approach

I've rejigged your script to use an edit mode bmesh.  Adds a plane on press of "axis key"  X, Y or Z at the cursor location. Rotates the mesh locally about given axis.  

It will keep rotating mesh 90 degrees on given axis. (4 times will return to starting point.  Test event type vs previously set axis to remove this behaviour.

bl_info = {
    "name": "test_modal",
    "author": "test",
    "version": (1, 0),
    "blender": (2, 79, 0),
    "description": "test",
    "category": "3D View"}

import bpy
import blf
import bgl
import bmesh
from mathutils import Matrix
from math import radians
axes = "XYZ"
def draw_callback_px(self, context):
    screen_x = context.region.width / 2
    font_id = 0
    blf.size(font_id, 32, 72)
    col = [0, 0, 0, 1]
    if self.axis in axes:
        col[axes.index(self.axis)] = 1
        bgl.glColor4f(*col)
        blf.position(font_id, screen_x, 7, 0)
        blf.draw(font_id, "Axis: %s" % self.axis)        


class TestModal(bpy.types.Operator):
    bl_idname = "test.test_modal"
    bl_label = "test"
    bl_options = {'REGISTER', 'GRAB_CURSOR', 'BLOCKING'}
    bm = None
    verts = None
    mwi = None    
    def execute(self, context):
        loc = self.mwi * context.scene.cursor_location
        if self.verts is None:
            self.bm = bmesh.from_edit_mesh(context.object.data)
            ret = bmesh.ops.create_grid(self.bm, size=10)
            self.verts = ret["verts"]

            bmesh.ops.translate(
                    self.bm,
                    verts=self.verts,
                    vec=loc)

        bmesh.ops.rotate(
                self.bm,
                verts=self.verts,
                cent=loc,
                matrix=Matrix.Rotation(radians(90.0), 
                        3, self.axis))
        bmesh.update_edit_mesh(context.object.data)

    def modal(self, context, event):
        if event.type in axes and event.value == 'PRESS':
            self.axis = event.type
            self.execute(context)

        elif event.type == 'LEFTMOUSE':
            bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
            self.report({'INFO'}, 'Completed')
            context.area.tag_redraw()
            return {'FINISHED'}

        elif event.type in ('RIGHTMOUSE', 'ESC'):
            bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
            context.area.tag_redraw()
            if self.bm:
                for v in self.verts:
                    self.bm.verts.remove(v)
                # bmesh.ops.delete(self.bm, geom=self.verts) # ??
                bmesh.update_edit_mesh(context.object.data)    
            self.report({'INFO'}, 'Cancelled')

            return {'CANCELLED'}

        return {'RUNNING_MODAL'}

    def invoke(self, context, event):
        args = (self, context)
        self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, args, 'WINDOW', 'POST_PIXEL')
        # store vars
        self.axis = "V"
        self.mwi = context.object.matrix_world.inverted()
        context.window_manager.modal_handler_add(self)

        return {'RUNNING_MODAL'}


def register():
    bpy.utils.register_class(TestModal)


def unregister():
    bpy.utils.unregister_class(TestModal)


if __name__ == "__main__":
    register()