How to Prepend to Delete Operator?
Override the operator

I'm not sure how a  pre delete handler or event would work?.  Whenever I model, a delete could be coming  at any time lol. 

However can override any operator with another.

If another operator (or panel for that matter) is registered with the same bl_idname, then it will override the one defined previously. Giving it the same properties as the original will see existing key-maps and UI use the new one seamlessly. 

For some operators and panels where the python code is available can import them and use their methods in our own. AFAIK Not the case with bpy.ops.object.delete 

To override the object delete operator (very basically) run the following script 

import bpy
from bpy.props import BoolProperty


class OBJECT_OT_delete(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "object.delete"
    bl_label = "Delete Objects Override"
    use_global : BoolProperty()
    @classmethod
    def poll(cls, context):
        return context.active_object is not None

    def execute(self, context):
        print("do something here")
        for o in context.selected_objects:
            bpy.data.objects.remove(o, do_unlink=True)

        return {'FINISHED'}
    def invoke(self, context, event):
        return context.window_manager.invoke_confirm(self, event)

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


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


if __name__ == "__main__":
    register()


and it will replace the delete operator. Is this good practice or recommended.. not sure (shrug) .. but it is one way to "do something before the delete operator is called"

Note: the prepend and append as shown in question is more associated with adding UI to a panels draw method.