I'm not sure a permanent penalty for razing is needed, at least in the current build where the AI ICS's like crazy, including building on 1 tile islands. You have to have some way to burn out their infestation.
Hopefully there's some way to reduce the AI ICS tendency and get it to focus on fewer, larger cities well. The problem is that ICS isn't a bad solution for the AI on the highest difficulty levels where its happiness bonuses are just so huge. Though I'm nervous about anything that makes the game easier, I'd lean towards toning those down.
Someone else's idea, but in my game I've changed the minimum settling distance from 2 to 3. Far from ideal, clearly, but it does have a pretty strong effect on preventing AI ICS. They still build in some really dumb spots (and it doesn't help with the 1-tile island problem), but overall it's a lot better.
Very ugly, blunt-instrument fix, but it does work.
I don't think its too hard to imagine your own civilian population being horrified by genocide being committed in their name, particularly of "civilized" foes in more modern eras, also razing an enemy city would realistically generate a massive response; guerilla warfare, sabotage, mass unrest, etc. which would be destabilizing in general, and happiness is a catchall mechanic representing unrest, stability and administrative burden.
Much easier to puppet.
Totally agreed. And mechanically, if you increase temporary unhappiness from razing (my suggestion was to double it), the main effect is that it's very likely to plunge an already-stretched conqueror into the deadly -33% combat penalty. It puts your troops in danger and means that you're really forced to slow down your conquest.
I don't think a permanent penalty is justified (except a permanent diplo penalty with the owner - I for one would burn with hatred for you for eternity if you razed one of my cities

), but it does seem like it should be less of a consequenceless, go-to option.
Caveat: especially with the AI as it is, I'd put a size limit (eg 4) on any serious penalties so you can burn down those really rubbish AI cities.
As far as nerfing puppets, my main suggestion would be:
an increasing +1 unhappiness for each additional puppet (i.e. +1 for the second, +2 for the third, etc)
and/or an additional increasing +1 unhappiness for each puppet in excess of your own cities
If happiness approximates stability, an empire of puppets far in excess of your own people is going to be very unstable. Mechanically, it means you can have a few powerful puppets who still give you truckloads of gold, but it's harder to do the "three core cities and an empire of puppets" exploit and at some point you have to start thinking about integrating captured cities into your empire proper.
Side thought: is it possible to move puppet unhappiness from regular unhappiness to

unhappiness? Just to stop the already-super-powerful Theocracy from being so useful for a massive puppet empire, but also empowering the Autocracy one (I think it's Police State)?