Apart from shrinking the collision polygon you pretty much need to make your own collision detection.
This is really only relevant for boxes though. If you're using a grid you can use an array to lookup collisions. Also you could do manual collision detection with integer positions. I've used that before for a retro platformer where I wanted the player to fit perfectly in passages his same size.
The sizes needed to be even, or as long as the the edges of the sprite were on integer positions you could test for a collision with:
bbright > wall.bbleft
bbleft < wall.bbright
bbbottom > wall.bbtop
bbtop < wall.bbbotom
and then objects right next to each other won't count as overlapping.
Apart from that I've done stuff like
set size of everything a little smaler
check for collisions
put the sizes back to normal
if the hotspots are centered you could do a compare right after the overlap condition.
abs(sprite.x-wall.x) < (wall.width+sprite.width)/2