How can I see the normal data of a face in Blender 2.9?
Like ZargulTheWizard said, scripting was needed. It turned out I had the script saved in a file from years ago. I'm a bit reluctant to post the script as I'm fairly certain I didn't write it myself, but I can't find the source when searching. So in order to help others I'll post it here. If you are the author, please let me know and I'll give credit accordingly.

This script will create an additional property in the &quot;Normals&quot; menu of the &quot;Object Data Properties&quot; tab:
import bpy
import bmesh
from mathutils import Vector

def draw_func(self, context):
    layout = self.layout

    me = context.object.data

    if me.is_editmode:
        bm = bmesh.from_edit_mesh(me)
        if bm.faces.active is not None:
            row = layout.row()
            col = row.column()
            col.prop(context.window_manager, &quot;active_face_normal&quot;, text=&quot;&quot;, expand=True)
            row.prop(context.window_manager, &quot;active_face_normal&quot;, text=&quot;&quot;)

            if context.window_manager.active_face_normal != bm.faces.active.normal:
                context.window_manager.active_face_normal = bm.faces.active.normal

    else:
        p = me.polygons
        if p.active is not None:
            row = layout.row()
            col = row.column()
            col.prop(p[p.active], &quot;normal&quot;, text=&quot;&quot;, expand=True)
            row.prop(p[p.active], &quot;normal&quot;, text=&quot;&quot;)


def upd_normal(self, context):
    bm = bmesh.from_edit_mesh(context.object.data)
    bm.faces.active.normal = self.active_face_normal.normalized()

def register():
    bpy.types.DATA_PT_normals.prepend(draw_func)
    bpy.types.WindowManager.active_face_normal = bpy.props.FloatVectorProperty(subtype='DIRECTION', precision=3, update=upd_normal)


def unregister():
    bpy.types.DATA_PT_normals.remove(draw_func)
    del bpy.types.WindowManager.active_face_normal



if __name__ == &quot;__main__&quot;:
    register()