Loop_multi_select selects nothing?
there are two problems :


edge.select = True not working as expected because passing the edge itself doesn't work (switching modes seem to break this pointer ),you should pass the index of the edge instead
selected_verts = [v for v in mesh.vertices if v.select] will be empty unless you switch back to object mode to update the mesh 


this is the working code :

def loop_from_edge(edge_ind, mesh):
    bpy.ops.object.mode_set(mode='EDIT')
    bpy.ops.mesh.select_all(action='DESELECT')
    bpy.ops.object.mode_set(mode='OBJECT')
    mesh.edges[edge_ind].select = True
    bpy.ops.object.mode_set(mode='EDIT')
    bpy.ops.mesh.loop_multi_select(ring = False)
    bpy.ops.object.mode_set(mode='OBJECT')
    selected_verts = [v for v in mesh.vertices if v.select]
    return selected_verts