Here's what I made.
First I found that memory point at 0xA2 is used to show current level number (note, the number's systematics aren't obvious, it's not like 0xA2=1 meaning level 1).
All warps write some number into it, for example this is how first warp works:
abcc: A5 50 LDA $50 ` memory at 0x50 shows current character (0-3)
abce: c9 03 CMP #$03 ` is it mouse?
abd0: D0 04 BNE $abd6 ` if it's not mouse then skip next two instructions
abd2: A9 11 LDA #$11 ` make warp - write 11 (level 6 ID) into 0xA2
abd4: 85 A2 STA $A2 ` yeah, into 0xA2
So we just need to find all possible entries of "STA $A2" (opcode 85A2). I dumped memory (0-FFFF) and searched within dump by hexeditor. There's dozen of entries to discover, and even though I traced all of them (by placing breakpoint or simply by scrolling down to them), there's a chance I missed smth.
Most of entries are used for things like this Crab level and first 4 micro-levels, technically they are warps, but not for our case.
Here's why I think there's no more room for warps-improvement of current run.
All of warping entries actually look like A9 xx 85 A2, where xx - number to write into 0xA2.
Last 8 levels of the game are presented at 0xA2 as numbers from 1 to 8 (8 - escape).
And there's no such entries (like A9 07 85 A2 - warp to final level).
Well, there's one fake entry. That's why I think that only first half of the game can be skipped partially (as was perfectly made by JXQ).