Replicate value stored in object into properties of new one
Set verts in invoke method
Set the value when the operator is invoked (run once). Give the new cylinder the operators value for self.vertices.
Demonstration of that change

    def invoke(self, context, event):
        obj = context.object
        self.vertices = obj[&quot;vertices&quot;]
        return {'FINISHED'}
    
    def execute(self, context):        
        bpy.ops.mesh.primitive_cylinder_add(
            vertices=self.vertices, 
            align='WORLD', location=(0, 0, 0))
        obj = context.object
        obj[&quot;vertices&quot;] = self.vertices
        return {'FINISHED'}

Some notes.
To match new cylinder transform to old would
mw = context.object.matrix_world.copy()

before new cylinder op, and assign it to new cylinder.
The poll method could be
def poll(cls, context):
    ob = context.object
    return ob and ob.name.startswith(&quot;Cylinder&quot;)

The poll method gets fired off a lot. Good practice not to use a try clause here.
The gizmo matrix basis could be
Matrix.Translation(ob.location)

However this is using local coords to make a global matrix and will result in &quot;losing touch&quot; with the cylinder if parenting or constraints are used to locate it.  Worth investigating using
Matrix.Translation(ob.matrix_world.to_translation())

Automatically set the custom property when cylinder added
Check out the way this answer https://blender.stackexchange.com/a/163258/15543 manipulates the newly created mesh primitive.  Recommend doing something similar here.
When the active operator is the add prim cylinder add the custom property.  In this case could poll for &quot;vertices&quot; in ob.keys()  (Maybe change name to cylinder_vertices)