I absolutely leave some addresses reserved, especially on hardware where I know I'll want to expand, but don't know what the expansion will be. You need to have high addresses for the interrupt and reset vectors, and you need to have low ram for zero page and the stack, so it probably makes sense to place the unused addresses in the middle between RAM and ROM (assuming you have ROM). Other popular choices include just above the stack area (might start at $200 or might start at $1000 for easier decoding) or a bit below the interrupt/reset vectors (again, might do something like up to $FE00 or even $F000 for easier decoding).
I have a 32K RAM + 32K ROM system, so I have to "steal" address space from one of those. I chose to steal it from RAM so I reserved a block of 256 addresses from $7F00-7FFF. I decoded select lines for 4 peripherals (3 on my board and one external) giving 64 bytes to each peripheral (most use 16 or less). If you wanted to add external RAM (eg. a video card or memory mapped flash storage device), then you will need to reserve a larger block of addresses. I used a PLD for the address decoding, and here is the relevant section from my PLD file (available at
https://github.com/SamCoVT/SBC/blob/master/ADDECODE.PLD). I never changed the code here so it still references a PIT, but I currently use that select line for my compact flash interface.
Code:
/** EQUATIONS **/
field addr = [a15..6];
ramsel = addr:[0000..7EFF]; /* 32K (-256 at top) RAM */
romsel = addr:[8000..FFFF]; /* 32K ROM */
/* peripherals are snuck into 256 memory locations at the
top of RAM */
viasel = addr:[7F00..7F3F];
pitsel = addr:[7F40..7F7F];
aciasel = addr:[7F80..7FBF];
lcden = addr:[7FC0..7FFF] & phi2;
I had originally expected to interface an external 8254 (Intel Programmable Interval Timer, or PIT) as I was familiar with that device and had one on hand. Because it's an Intel device, it needed the separate RD* and WR* so I had those decoded as well. I ended up adding a 6522 to my single board computer design instead, which had a timer I could use, so I didn't end up adding the 8254 at all. The decoded area was still available, however, and I ended up adding an external compact flash slot, which also needed the separate RD* and WR* lines so it was good I brought those out.
I also have I2C and SPI connected devices (for EEPROM and SD Card), and those were interfaced through the parallel ports of the 6522. You need some addresses reserved for the 6522, but then can connect a whole slew of things to those and bit bang the serial interfaces. You can also connect parallel devices by using one port for the data and the other port for whatever control signals you need. It will be slower than having that device directly on the 6502 bus, but it does work and is generally fine for playing around and exploring.
I will recommend the use of a PLD or similar device for address decoding because you can easily remap your memory layout if, for example, you realize later that you want to reserve 2K instead of only 64 bytes for a particular expansion. I used a 22V10 device.