I did some more analysis on the STLink/v2 bootloader. There doesn't seem to be any way to configure it to skip the DFU mode and jump straight to the application. Specifically, I didn't see anything in the execution trace that looked like it was accessing any interesting registers or areas of flash outside of the main bootloader code.
I took a look at how the JLink firmware for STLink discovery boards arranges to launch the JLink firmware. The upgrade process rewrites the bootloader's reset handler with a stub that jumps directly to the JLink reset handler, bypassing the rest of the bootloader. Reversibly patching the bootloader to jump straight to the application seems like it would require a lot of effort to get it to work robustly, so I'm probably not going to look any further into the v2 bootloader.
Oen problem with the STLInk bootloader is its size (16k), so I can't make the BMP fit in flash on the normal STLink's as they are 64k
I know that the STM32F103C8 is often 128k, but the STLink firmware upgrade tool does not allow code beyond 64k if it detects a 64k device ;-(
But perhaps some smaller programmers like DAP is smaller and will fit
It looks like the DAPLink build process pads it out to the maximum size, but the actual firmware size is closer to 46KiB, so it could just barely fit in 64KiB.
However, as noted above, the v2 bootloader seems to be more trouble than its worth, so it's a moot point.
The v2-1 bootloader, on the other hand, works great with the DAPLink firmware. Reversibly updating Nucleo boards seems to work reliably for me.