It seems most chess programs score a position basically the same way, give or take a few tenths of a point, for a given position. For example, Stockfish might score a position as .65 while Houdini might score the same position .80. If this is essentially the case, are there general "rules" for scoring a position?
This is certainly not the case. Traditional engines "score" a position by running their evaluation function (which differs from engine to engine) on the best position at the end of their search tree (which also differs from engine to engine, since this position depends on their search algorithm).
Sure there are standard concepts for scoring a position - e.g. which side has more material, which side has doubled pawns, which side has rooks on open files - but ultimately each engine does it differently, and there are positions which one engine can be very optimistic on while another is not. There are even positions where one engine thinks White has an advantage and another engine thinks Black has an advantage. Example from the ongoing TCEC Season 18 superfinal.
Everything is based off of the assumption that 1 point= 1 pawn. Everything else is relative to that.
If an engine is evaluating a position at +3 that means either it thinks that white can win the material advantage of three pawns or that white can obtain a positional advantage equivalent to three pawns or some combination of the two.
How things are weighted vary from engine to engine but the basic concept is the same.