If you read the arm documents you will see where the vector table is and what the contents are. the bare minimum is at address 0x00000004 you need the (thumb) ADDRESS of the reset handler.
If you read the stm32 documents you will see that based on the boot pins various things happen, the typical use case is 0x08000000 which is the flash that contains your program, is mapped to 0x00000000. You can choose to link for 0x00000000 or you can choose to link for 0x08000000 as most folks do, the (thumb) address at offset 0x00000004 (and 0x00000008 and so on) would then point to somewhere in 0x08000000.
Memory is just for read write stuff, instructions, .text, is read only you dont need to write, and for a microcontroller you need the application to be in non volatile storage, and they are designed to run code out of the flash (these days this isnt a good idea except for purpose built flashes like these).
So your program .text, and any other read only data goes in flash. Any .data you have is kept in flash but the bootstrap copies it to ram and the bootstrap zeros .bss, then once booted and into your entry point in C (often main() but that is just an arbitrary function name) the typical use case is your program is in read only flash and your data is in read/write ram. As it should be.
Granted as the programmer you are responsible for all of the above, the vector table, the bootstrap, the linking, as well as writing the program to do things.
The cortex-m boot scheme is very typical, the two most common are just run at some address, or have a vector table of addresses where the handlers live. The full sized arms are the run from this address, the cortex-m's are a list of addresses, a vector table.
When you read up on an nxp or an atmel samd or other implementations of cortex-ms you will find that they all place your flash in the boot space as they should, but may do it in different ways. Some have factory bootloaders that can be invoked in various ways and the core doesnt magically change they simply map the factory bootloader into the zero address space of the cortex-m.
its all there in the arm and st and nxp and atmel and other documents.
EDIT
system memory is for your data, read/write items, variables, data structures that change, etc. if you choose not to use the already built in bootloader, then you can choose to write your own as part of your application and as a bootloader you are welcome and in fact pretty much have to download the new program into ram, but that doesnt mean you have to run it from there (you can despite the word harvard being tossed around) or more likely you just use that as a holding area to burn it to flash. The typical purpose of a microcontroller is to run the firmware on flash and use sram for any read/write data that may change. Clock radios, toasters, remote controls, and a myriad of other things.