heartbeats are indeed not that harmful as some claims
For example, when I joined Arkhalia PW builder team and gain access to areas I found out one area where someone placed 100 gargoyle statues (which all running heartbeat) only as a decoration. And this was there several years and it wasn't problem - Arkhalia was always fast and stable.
Pseudo heartbeats are often even worse replacement because there is a memory bloating issue when structures like effect or itemproperty are passed in (*acaos said that somewhere - I believe him). And generally are slightly worse, the only advantage is that pseudo heartbeats are not running all the time.
Personally used heartbeat for player, but not default.nss! because this script is running for all script created traps which in my module are many. I changed the PC heartbeat script via NWNX. And one heartbeat on placeable for LootBag cleaning purposes.
This is just wrong. I'm happy to post a few hundred of acaos' pseudoheartbeats to prove the point, if I have to. '> Pseudoheartbeats are very often the best way to do something.
You're absolutely correct about the memory leak when structs are passed through recursive functions, but it's pretty easy to avoid that. We use only one permanent heartbeat on HG - the module heartbeat. Ours is pretty hefty, including MySQL calls, but it runs just fine. All other heartbeat functionality is implemented either on a temporary object (think creatures) where the heartbeat ends when the object ceases to be, or via pseudoheartbeat or other event (like timestamped area enter/exit). We don't use spawned in places for with heartbeats already on them, as they get low engine priority like AoE heartbeats. Instead, if we want the place itself to run the code, we'll use a pseudo on it.
While I agree that a lot of the dire warnings about heartbeats are overhyped, I have seen firsthand what too many and/or poorly written heartbeats can do to module performance. The PoA base module of HG when I first took over actually had a perceivable heartbeat, because of the absurdly bloated module heartbeat that was, among other things, cycling all player inventories several times a heartbeat. It would quite literally do a brief hang about every 7 seconds (not 6 - non-linux systems seem to have longer heartbeats in general, with our lin server turning over about every 5.2 seconds, but Win-based servers all seem more susceptible to increased delays between heartbeats due to serverload).
Once you work out how, it's not difficult to replace most heartbeat functionality in a more efficient way - and that will often include pseudos. Overhead is overhead, and while I don't hold to the extreme position that efficiency must override all other building concerns (that's just absurd thought-hyperbole, as you could waste countless hours to eek out a few saved cycles - think law of diminishing returns), I also believe in good coding practices, which means minimizing overhead when it's not difficult or overly time-consuming to do so.
Funky