Lots of things run code slowly from flash
yup, it is much more common to compile an image designed to run entirely in ram, so all the addresses of all the functions and variables belong to the ram range, however the final binary image is then inserted into flash.
What happens at startup?
In flash there is a "loader" that copies the entire image into ram, then jumps to crt0, which in turn initializes some parts, and then jumps to main.
However, when ram is scarce ... someone thinks of leaving some parts, such as LUTs, or in any case "immutable" data structures in the "constant pool", in flash.
Things get complicated, especially if the flash is not accessible to uint8_t but only to uint16_t or worse to uint32_t.
When I can, I try to propose the simplest possible scenario.