Number of vertices and edges report no changes after adding boolean intersect modifier
Use the evaluated object
Modifiers don't alter the mesh, they &quot;Modify, Generate, Deform or Physics&quot; the mesh result ... using the mesh as input.  Think of it like a method in mathematics sin(x) doesn't alter x it returns a result using x as input.
The result is available in newer versions of blender as the evaluated object.
How do I get a mesh data-block with modifiers and shape keys applied in Blender 2.8?
This is the result of all modifiers applied. It in no way applies the result to the mesh.  As with most modifiers they are often not easily reversible if applied, and is not required to simply test if geom would be changed.
Test script looks at difference between edge count of cube unmodified and with all modifiers.
import bpy
context = bpy.context
scene = context.scene

cube = scene.objects.get(&quot;Cube&quot;)
cone = scene.objects.get(&quot;Cone&quot;)
if cube and cone:
    print(len(cube.data.edges))
    bm = cube.modifiers.new(name=&quot;Foo&quot;, type='BOOLEAN')
    bm.operation = 'INTERSECT'
    bm.object = cone
    dg = context.evaluated_depsgraph_get()
    eval_cube = cube.evaluated_get(dg)
    print(len(eval_cube.data.edges))

A better option would be to look at the evaluated object both before or after to see the change in evaluated meshes. (eg the cube could already have a stack of modifiers)
import bpy
context = bpy.context
scene = context.scene

cube = scene.objects.get(&quot;Cube&quot;)
cone = scene.objects.get(&quot;Cone&quot;)
if cube and cone:
    cube.evaluated_get(context.evaluated_depsgraph_get())
    print(len(eval_cube.data.edges))
    bm = cube.modifiers.new(name=&quot;Foo&quot;, type='BOOLEAN')
    bm.operation = 'INTERSECT'
    bm.object = cone
    
    eval_cube = cube.evaluated_get(context.evaluated_depsgraph_get())
    print(len(eval_cube.data.edges))
    cube.modifiers.remove(bm)

If the mesh has no modifiers of shapekeys prior to adding could check for this to avoid an unrequired evaluation.
prior_cube = (
    cube.evaluated_get(context.evaluated_depsgraph_get()) 
    if (
        cube.data.shape_keys 
        or cube.modifiers
        ) 
    else 
        cube
    )


Test run, default cube on RHS has subsurf modifier. Results (before, after) are 12, 64 and 92, 192
An interesting technique to test for intersection.  Could be on the slowish side.  Looping over objects getting data and adding modifiers, then looping again would require only evaluating  the context depsgraph twice instead of twice for each object.