Vertex Normals different from loop normals
I never used tessface logic, but I can tell that you are using the wrong index in data.loops[] : each polygon has a loop_begin and a loop_end variable, and each loop with index in [loop_begin; loop_end[ belongs to that face, and is associated with a vertex, which have loop.vertex_index as index.
that means that there are WAY more loops than vertices.

also, it seems that you are using flat shading. in that case, loop normals  are the same that their faces' normals, and (I am not sure about that last bit) vertex normals are interpolated between face normals, and will be used for smooth shading