I've done some more digging on this and I've come up with a solution that works for me. Though it's not exactly plug-and-play, it's pretty simple to implement on a case-by-case basis.
What I tried above was never going to work, for a couple reasons. For starters, $IS_SYS and $IS_PORT are not, as I had assumed, mutually exclusive. "SYS" is anything that's not a special +Start system.sh script, and "PORT" is a subset of that. So, when I tried to make it "if IS_SYS, else if IS_PORT", that was never going to do anything. They're all SYS and when they're not, they're not PORT either, so the "else" part would never happen, in any case.
So with that out of the way, I can just rewrite the test. If IS_SYS (that's basically everything), it checks the default paths. Doesn't find anything for ports, because their images are in the "ports" folder, not the individual "system." So instead of "else," I just added another "if IS PORT," then check for art in paths with ports instead of $SYSTEM dir: "If SYS, check $SYSTEM path; fi; if PORT, check 'ports' path, fi."
But that still didn't work. Okay, so...why doesn't it work. Well. Runcommand is the part that displays the image. It looks for an image that's named the same as the game, right? But how does it know. It's looking at the %ROM% parameter that's passed to it by EmulationStation. Only for ports it doesn't work that way.
With regular console systems, EmulationStation says (simplified):
runcommand SYS [system] %ROM%
...and the "ROM" is the rom file. If Runcommand can find a picture in the "[system]" folder with the same basename then it's got a match.
For ports, that doesn't happen. For ports, EmulationStation goes:
bash %ROM%
where "ROM" is the launch script. The launch script then calls up Runcommand with
runcommand PORT [system] %FOO%
...where "FOO" is whatever weird stuff is used in the launch command for that particular port. It might be the path to a file or directory that may or may not share a basename with the launch script and image file, or it might be a long string of command-line flags that aren't even legal filenames. It's different for every "system." And this is what Runcommand is looking for when it tries to match a filename for the image to display. This is never going to work either. That's why they don't do it that way. That's why they have launching.png.
So what do I do about it. As mentioned above, I can place a launching.png in the configs/ports or configs/ports/[system] dirs. Which works fine when a "system" only has one game on it, but for times when different games can all be launched with a shared system setup (like all the Doom expansions all using the same lr-prboom core), it means I would have to use the same image for all of them.
Or would I? And in fact no, I would not. If it's looking for a launching.png I will let it find a launching.png. But I can decide what that looks like when it finds it.
In my launch script, example (simplified):
#! /bin/bash
runcommand.sh PORT "[system]" "[%FOO%]"
...before the run-command, I add a line that symlinks (at first I copied, but symlink will shuffle less data around) the desired image to the expected location: ln -sf "/home/pi/.emulationstation/downloaded_media/ports/screenshots/$(basename ${0%.*}).png" /opt/retropie/configs/ports/launching.png:
#! /bin/bash
ln -sf "/home/pi/.emulationstation/downloaded_media/ports/screenshots/$(basename ${0%.*}).png" /opt/retropie/configs/ports/launching.png
runcommand.sh PORT "[system]" "[%FOO%]"
Using $(basename ${0%.*}) substitutes the name of the launch script (the one that this command is inside of) without path or extension, so I can just copy-paste this same line into every one of my scripts and they'll all link their own, individual launch art before calling Runcommand. It means that if I rename the script I'll have to rename the image, but this is just like how all the other systems work anyway, with the rom name being linked to the image name, and this way I didn't have to type out a different filename in each of my scripts.
If you wish to use this method, you will need to substitute the path to your images based on your own configuration. Which is why it's not exactly plug-and-play, since it seems everyone has these in a different place.
Here is an actual, non-simplified example of one in action:
pi@retropie:~/RetroPie/roms/ports $ cat doom-sigil.sh
#!/bin/bash
ln -sf "/home/pi/.emulationstation/downloaded_media/ports/screenshots/$(basename ${0%.*}).png" /opt/retropie/configs/ports/launching.png
"/opt/retropie/supplementary/runcommand/runcommand.sh" 0 _PORT_ "doom" "/home/pi/RetroPie/roms/ports/doom/sigil/DOOM.WAD"