Hi burek,
You played this hand well. At a regular table with a read that villain is a strong, solid player and with the knowledge that villain perceives you to also be a solid player then shoving the river with 99 is reasonable but a little thin. It's thin because most of your perceived semi-bluffing range got there with the exception of hands like non-spade JT, KJ, etc., which most people float flop with anyway. Thus, if villain has AK then I'd expect him to fold on the river with these stack sizes because he doesn't beat anything. With 99 you could potentially get called by AQ, but I'd expect most regs to re-raise the flop while deep and OOP on this drawy board. I'd also expect AA and QQ to 3bet this flop, which means that his calling range on the river starts to get weighted toward flushes and most non-flush hands are likely to fold.
Having said all that, that's only against a player who you know well. At at anonymous table with a 50 hand sample on someone who appears to be very aggro (he's 3bet several times, cbet 90%, cbet in 3bet pots 100%) I think this is a clear value shove. For one, his range possibly includes two pairs like A9, A6, A8, but most importantly, you just don't know villain enough to be sure that he's not a station. He could always level himself into a call with Ax when he has such an aggro image. You have a set in a 3bet pot against a player who you don't know much about. Checking is a bit too weak. Shove and let him figure out what he wants to pay you off with.
I'd also note that it's important for you to be aware of your own image even at these anonymous games. If you've been active and maybe have been caught bluffing before then the river is an even clearer shove.
One point of your analysis that I disagree with is that you think villain won't have a flush after he check-calls the turn and checks the river. Check-calling a flush on the turn is imo the best line. Your range is still perceived to contain bluffs, many of which could fire the river, especially on a board changing card like another spade. You're also still likely to value shove sets. Check-calling the turn with a flush might lose some value against an AQ that checks river (if AQ bet/calls AI on the turn, which is likely but somewhat debatable), but against the entirety of button's range I think there's no reason to shove a flush.
Lastly, this is possibly inconsequential but I do prefer just putting villain all-in by betting $52 rather than shoving all-in yourself. Whether they know it or not, most players have a psychological response to seeing all your chips getting shoved in the middle. All-in just looks a little more threatening and dangerous compared to $52. Of course, I'm not saying that this is likely to make a huge difference in the chance villain calls, but it's still worth doing if it leads to a lighter call-down 1% of the time. Against a weak, recreational player I would often just bet $50 on the river and leave him with $1.11. I've found it increases their calling frequencies substantially. Weak players don't like the idea of losing all of their money in one hand. Leave him a buck to play a SNG!