I prefer pragmatic approach You focused learn those parts of the system you need to interact with. So you uncover one piece of puzzle at a time. After some time, you will learn enough to see the big picture.
Of course, if there are any docs or a mentor to introduce you to the code and explain top-level decisions and architecture, it has to be done from the start.
Also following the code execution path from the entry point and learning function by function would be time consuming and ineffective. First, human brain has a limited capacity to store and process information for a particular level of abstraction. If you expect to read through hundreds of functions and remember them (or at least their names and where they are) you will miserably fail.
As experience with studying in other domains not related to programming (for example, foreign languages, operating some machinery, performing a worklflow etc.) shows, it is best if you get first some general background then pick up the pieces you need in the right context. You learn elements you need for your scenarios, understand their use, adopt the technique and finally remember them with relation to situation and your experience. This is by far the best way.
I can provide an analogy. When you learn a foreign language you learn the words and expressions based on their commonality and appearance in certain dialogues and scenarios but certainly not by reading through a dictionary a to z. The same with code.