Script to intersect two objects gets rapidly slower
As you note rightly, do not use bpy.ops if you can avoid it because it forces a scene update every single time.

So I recommend doing this:

me = obj.to_mesh(bpy.context.scene, True, "PREVIEW", calc_tessface=True, calc_undeformed=False)


No operator is used here and it will give you a copy of the the mesh data with all modifiers applied.

Deletion of objects from blender or with ops still keeps their data around until you close and reopen the file. Then data blocks that are not used (users = 0) will be discarded.
IIRC, you can force-delete objects completely via API, but this is not recommended as it tends to cause crashes.

You can, however, achieve the same result as with the operator using:

bpy.data.objects.remove(obj, True)