You need to use a different matrix to transform your normal vectors when your model's transformation might include non-uniform scale.
When we stretch a shape along, say, just the y axis, the y coordinate of all of the vertices gets exaggerated, making the object taller.
This doesn't just elongate the model - it also changes the orientation of the faces. Faces that run diagonal to the stretched axis end up tilting further away from that axis. As the model gets taller vertically, its normals start to point out more horizontally.
(Diagram from this article explaining how the inverse transpose matrix is used for transforming normals. Notice how as the model gets taller, the normal gets flatter.)
So this gives us a conundrum: the y coordinate of the vertices needs to get bigger, but the y coordinate of the normals needs to get smaller.
If we neglect this detail and just use the same model matrix for transforming both the vertices and the normals, the shading we get will be subtly wrong. Things like specular highlights will bunch up on the skinny poles of the object, instead of spreading across its elongated sides.
The inverse transpose of the model view matrix - what you've called the Normal matrix here - computes exactly the transformation we need to adjust the normals correctly. By inverting it, we "undo" the scaling factors and the rotation. By transposing it, we "undo" the undone rotation (the inverse of a rotation matrix is its transpose), getting us back to the rotation we started with, but still with the scaling factors inverted as desired.