Different aspects of mirroring have different purposes.
Mirroring is the result of incomplete decoding of the address bus. Incomplete decoding saves a gate or two and usually doesn't hurt anything. Shaving pennies off the replication cost of millions of Game Paks could increase profit.
The 65816 requires the reset and interrupt vectors to be available at $00FFE0-$00FFFF in order to start up. If ROM is not mirrored into $00FFE0-$00FFFF, the system will hang at startup.
Only ROM at $808000-$FFFFFF is set up for fast access. The rest of ROM ($008000-$7DFFFF) is hardwired for slow access so that the 65816 can retrieve its reset vector before the memory controller is configured. So programs run memory controller initialization somewhere in $000000-$7DFFFF and then jump to $808000-$FFFFFF once they've initialized the memory controller.
I/O and a portion of RAM are mirrored into $00-$3F and $80-$BF so that the CPU can access a subset of data in ROM, data in RAM, and I/O without having to either change the data bank register or use 24-bit addressing all the time. Unlike the 8086, the 65816 doesn't have "prefixed" instructions that can change which segment is used. Instead, the data bank register must be explicitly reloaded in order to use 16-bit addressing, which is slightly faster than full 24-bit addressing. In addition, several 65816 addressing modes are hardwired to use bank $00, particularly those dealing with the base pointer (D) or stack pointer (S).
See Fullsnes or Super NES Development Wiki for more information