Can be made much more efficient if you replace the trigonometric stuff with explicit algebraic variables. This will involve clearing denominators and also augmenting with more algebraic expressions that enforce the basic trig identities.
eqns = {c1 == Cos[a] Sin[b], c2 == Cos[b] Sin[c], c3 == Cos[c] Sin[a],
r == Tan[a] Tan[b] Tan[c]};
e2 = Apply[Subtract, eqns, {1}];
e3 = e2 /. {Cos[a_] :> c[a], Sin[a_] :> s[a], Tan[a_] :> s[a]/c[a]};
vars = Variables[e3];
newe = Map[#^2 + s[#[[1]]]^2 - 1 &, Cases[vars, c[_]]];
allexprs = Numerator[Together[Join[e3, newe]]];
elims = Cases[vars, _c | _s];
keep = Complement[vars, elims];
elim = Eliminate[allexprs == 0, elims]
(* Out[75]= c3^2 r + c1 c2 c3 (1 + r^2) == (1 - c1^2 - c2^2) r *)
I often find it easier to use GroebnerBasis rather than Eliminate.
Timing[gb = GroebnerBasis[allexprs, keep, elims]]
(* Out[73]= {0.133516, {c1 c2 c3 - r + c1^2 r + c2^2 r + c3^2 r +
c1 c2 c3 r^2}} *)
e2 = Subtract @@@ eqnsande3 = e2 /. {Cos -> c, Sin -> s, Tan -> (s[#]/c[#] &)}and most especiallynewe = Cases[vars, x : c[y_] :> x^2 + s[y]^2 - 1]? I guess the first two could be a matter of clarity but your code fornewejust seems needlessly complicated. Please pardon me for what may seem a rather disrespectful question, but actually it is my respect that makes me care why you chose to code this as you did. – Mr.Wizard Jul 21 '13 at 13:02@@@infix (I often avoid infix...). As for yournewe = ..., I guess it's a bit out of my range of coding tactics. Strangely enough, I would reverse your analysis though. I think your first two are both simpler and more clear than what I had, whereas the third I find to be a matter of taste. Reason being, as a usage of pattern matching that is not terribly familiar (to me), reconstructing the idea later would become more difficult. – Daniel Lichtblau Jul 21 '13 at 16:29