Bought a new cap, made zero difference. Filler cap threads are not damaged, and the new cap gasket has a nice ring where the lip is sealing. Just seems to be that fuel splashes up, gets through the air holes, seeps around the edges, and oozes out from between the threads. As a test, I tried wrapping the threads with electrical tape. On the plus side, it stopped leaking. On the downside, the gas dissolved the tape and made a black, gooey mess. I can confirm that if I make a gasket without any holes in it, it seals fine and doesn't leak, except the engine stalls eventually because the suction builds up in the tank.
Any ideas? Almost seems like I was on the right track with the electrical tape. Maybe I need to find something equivalent to teflon tape that is fuel proof and wrap the filler neck.