Incorrect context for bpy.ops.screen.frame_jump.poll()
OK so I found a solution for this.

It should be noticed that I just needed to run everything as a script. I however thought that the UI would help me debugging, hence i tried to run it all from within blender.

The solution was to actually run blender in background mode, and not using bpy.ops for anything else then rendering.

blender blender_file.blend --background --python script.py


When running in background mode, I do not need all the callbacks to know when stuff is done, since the code is no longer async.

Now to do the physics simulation and then render I can simply do the following:

# Reset to first frame
scene = bpy.context.scene
scene.frame_set(0)

# Run the physics simulation
for i in range(250):
    scene.frame_set(i)

# Render image
bpy.ops.render.render(write_still=True)