> How would the application know which piece to use on boot up?
Some STM32 families can assign variable start address, via the "option bytes", and some families have dual banked flash.
In the simplest case you always start from 0x08000000 and there you put the "initial loader".
> It seems to me that I would have to ensure enough memory for both the current firmware and the new firmware. This is correct?
If the "loader" knows how to get the new firmware, it can erase the whole memory of the "main" part and then move the update in. Then you don't need double space for the application. But for complicated update protocols (wireless....) the loader itself needs to be updated often, then you need more complex scheme and more flash reserved for this.
-- pa