We find the tangent plane to (x^y)(y^z)(z^x)=1 at (1,1,1) by computing the gradient.

ContourPlot3D[x^y y^z z^x ==1, {x, .5, 3}, {y,.5, 3}, {z, .5, 3}]

Show[ContourPlot3D[x^y y^z z^x ==1, {x, .5, 3}, {y,.5, 3}, {z, .5, 3}],ListPointPlot3D[{{1, 1, 1}}, Filling->Bottom, PlotStyle->PointSize[Large], PlotStyle->Black]]

Show[ContourPlot3D[x^y y^z z^x ==1, {x, .5, 3}, {y,.5, 3}, {z, .5, 3}],ParametricPlot3D[{1+t, 1+t, 1+t},{t, -.5, 1}],ListPointPlot3D[{{1, 1, 1}}, Filling->Bottom, PlotStyle->PointSize[Large], PlotStyle->Black]]

Show[ContourPlot3D[{x^y y^z z^x ==1, x+y+z==3}, {x, .5, 3}, {y,.5, 3}, {z, .5, 3}],ParametricPlot3D[{1+t, 1+t, 1+t},{t, -.5, 1}],ListPointPlot3D[{{1, 1, 1}}, Filling->Bottom, PlotStyle->PointSize[Large], PlotStyle->Black]]

We check if two surfaces are perpindicular by checking their tangent planes.  This reduces to checking their gradients.

ContourPlot3D[{(((x-1))^2)+(((((y-2)/3)))^2)==(z+1), (x^2)+((((y/2)))^2)+(z^2)==3},{x, -2, 4}, {y, -5, 6}, {z, -3,3}]

Show[ContourPlot3D[{(((x-1))^2)+(((((y-2)/3)))^2)==(z+1), (x^2)+((((y/2)))^2)+(z^2)==3},{x, -2, 4}, {y, -5, 6}, {z, -3,3}],ListPointPlot3D[{{1, 2, -1}}, Filling->Bottom, PlotStyle->PointSize[Large], PlotStyle->Black]]

ContourPlot3D[{(((x-1))^2)+(((((y-2)/3)))^2)==(z+1), -z==1},{x, -2, 4}, {y, -5, 6}, {z, -3,3}]

ContourPlot3D[{2(x-1)+(y-2)-2(z+1)==0, (x^2)+((((y/2)))^2)+(z^2)==3},{x, -2, 4}, {y, -5, 6}, {z, -3,3}]

ContourPlot3D[{(((x-1))^2)+(((((y-2)/3)))^2)==(z+1),(x^2)+((((y/2)))^2)+(z^2)==3,-z==1,2(x-1)+(y-2)-2(z+1)==0},{x, -2, 4}, {y, -5, 6}, {z, -3,3}]

ContourPlot3D[{-z==1,2(x-1)+(y-2)-2(z+1)==0},{x, -2, 4}, {y, -5, 6}, {z, -3,3}]

Show[ContourPlot3D[{-z==1,2(x-1)+(y-2)-2(z+1)==0},{x, -2, 4}, {y, -5, 6}, {z, -3,3}],ParametricPlot3D[{{1+2 t, 2 + t, -1 - 2 t},{1, 2, t}},{t, -1, 1}]]

We find the direction of travel that maintains a constant height by using the fact level curves are perpindicular to the gradient.

Show[ContourPlot3D[z==10-x^4-x y-y^2,{x, 0, 2}, {y, 1, 3},{z, -20, 10}],ListPointPlot3D[{{1, 2, 3}}, Filling->Bottom, PlotStyle->PointSize[Large], PlotStyle->Black]]

Show[ContourPlot3D[{z==10-x^4-x y-y^2,0==10-x^4-x y-y^2-3},{x, 0, 2}, {y, 1, 3},{z, -20, 10}],ListPointPlot3D[{{1, 2, 3}}, Filling->Bottom, PlotStyle->PointSize[Large], PlotStyle->Black]]

Show[ContourPlot3D[{z==10-x^4-x y-y^2,0==10-x^4-x y-y^2-3},{x, 0, 2}, {y, 1, 3},{z, -20, 10}],ListPointPlot3D[{{1, 2, 3}}, Filling->Bottom, PlotStyle->PointSize[Large], PlotStyle->Black],ParametricPlot3D[{{1-6 t, 2-5t, 3}, {1-5t, 2+6t, 3}}, {t, -2, 2}, ColorFunction->"Rainbow"]]

We compare the meaning of the gradient in the first and last example

Show[ContourPlot3D[{x^y y^z z^x ==1, x+y+z==3}, {x, .5, 3}, {y,.5, 3}, {z, .5, 3}],ParametricPlot3D[{1+t, 1+t, 1+t},{t, -.5, 1}],ListPointPlot3D[{{1, 1, 1}}, Filling->Bottom, PlotStyle->PointSize[Large], PlotStyle->Black]]

Show[ContourPlot3D[{z==10-x^4-x y-y^2,-6(x-1)+-5(y-2)+-(z-3)==0},{x, 0, 2}, {y, 1, 3},{z, -20, 10}],ListPointPlot3D[{{1, 2, 3}}, Filling->Bottom, PlotStyle->PointSize[Large], PlotStyle->Black],ParametricPlot3D[{{1-6 t, 2-5t, 3}}, {t, -2, 2}, ColorFunction->"Rainbow"]]