Relation between BGE framerate and Action framerate
I think I solved it as follows:

import bpy, bge

BGE_frame = 0

scene = bge.logic.getCurrentScene()
bpy_scene = bpy.data.scenes[scene.name]

BPY_FPS = bpy_scene.render.fps / bpy_scene.render.fps_base
BGE_FPS = bge.logic.getLogicTicRate()

BPY_BGE_RATIO = BPY_FPS / BGE_FPS

def BGE_frame_to_Animation_frame(BGE_frame):
    return BGE_frame * BPY_BGE_RATIO

def main(cont):
    global BGE_frame

    arm = cont.owner

    print(BGE_frame)
    print(arm.getActionFrame()) # Kept for comparison
    print(BGE_frame_to_Animation_frame(BGE_frame)) # Outputs approx. same result as above

    if not arm.isPlayingAction():
        arm.playAction("run", 0, 45, play_mode=bge.logic.KX_ACTION_MODE_PLAY)
        BGE_frame = 0
    else:
        BGE_frame += 1        

    print("\n")


I'm not sure of it is a good practice to access blender data from BGE, but it works :-) Comments/suggestions are welcome! Thanks.