Updated 9/1/13 to answer follow up.

Added additional rules, so that no need to use FullSimplify (sometimes using FullSimplify will reverse the effect of your own rule). Here are 5 rules that covers the cases you have and the new one you added. (if more cases are not covered, new rules can be added)

You can also also apply all the rules at once, so that you do not have to determine beforehand which one to use for different expression. Mathematia internal pattern matching will pick the rule needed to apply.

ClearAll[x, y, z, g, foo];

p1 = Times[Conjugate[x_] Conjugate[y_]] :> Conjugate[x y];

p2 = Times[x_ Conjugate[x_]] :> Abs[x]^2;

p3 = Abs[x_ y_]^n_. :> Abs[x]^n Abs[y]^n;

p4 = Plus[x_ Conjugate[y_] , y_ Conjugate[x_] ] :> 2 (Re[x] Re[y] + Im[x] Im[y]);

p5 = Plus[x_ , Conjugate[x_] ] :> 2 Re[x];

allRules = {p1, p2, p3, p4, p5};

expr = {

{foo = x Conjugate[y] + y Conjugate[x]; foo, foo //. allRules},

{foo = x Conjugate[y] + y Conjugate[x] + z Conjugate[g] + g Conjugate[z]; foo, foo //. allRules},

{foo = x Conjugate[x]; foo, foo //. allRules},

{foo = x y Conjugate[x y]; foo, foo //. allRules},

{foo = x y z Conjugate[x y z]; foo, foo //. allRules},

{foo = x + Conjugate[x]; foo, foo //. allRules},

{foo = x y + Conjugate[x y], foo; foo //. allRules},

{foo = x y z + Conjugate[x y z]; foo, foo //. allRules},

{foo = x y + Conjugate[x] Conjugate[y]; foo, foo //. allRules},

{foo = x y z g + Conjugate[x] Conjugate[y] Conjugate[z] Conjugate[g]; foo, foo //. allRules}

};

Grid[expr, Frame -> All, Spacings -> {.5, 1}, Alignment -> Left]

This gives