So just in case anyone cares, it appears that even though this isn't mentioned anywhere in the Xtensa documentation, only the top 24 bits of VECBASE are actually significant/used.
More specifically, instead of (as the docs imply) calculating a vector address as 'VECBASE + offset', what the Xtensa processor actually appears to do is take '(VECBASE & 0xffffff00) | offset' instead.
..which means any vector table needs to be aligned on a 256-byte boundary to work properly.
--Alex