Fixed pipeline functionality was deprecated because it was essentially fixed.
To support new tricks and such, as a rule, required new OpenGL functions, it became clear that the constant support of the requested functions means an increase in the size of the OpenGL API and a gradual increase in its number.
Meanwhile, the hardware was becoming more sophisticated and powerful, and OpenGL was not fully operational. Thus, the programmable pipeline was conceived.
With OpenGL3, the Kronos group is "deprecated" by the fixed pipeline function. This caused a huge noise, because there was so much code and so many talents that were invested in an established fixed pipeline, so they partially abandoned their decision by introducing the core and compatibility profiles. The main profile includes a new programmable pipeline model, and the compatibility profile includes a core plus most / all of the fixed functionality, allowing applications to use any model.
We are now working on OpenGL 4.2, and the compatibility profile still exists and shows no signs of extinction.
In short, the reason for the depreciation is not that the old model is not suitable for application programmers; rather, it was a heavier burden for developers. The actual model is strong enough, and many applications / developers who use programmable functions find themselves redistributing the main parts of the fixed functionality (glBegin, glEnd, matrix stacks, transformation calls, etc.).
So go ahead, implement your own matrix stacks. But, if you come up with an even better idea, share it with us :)