Sorry for the late reply. I did work on all this stuff since then. And alas I didn't found any better solution.
To rotate a camera to face a point while still having Y up,
Transform.looking_at(target,Vector3(0,1,0)) works very well.
In fact, I just checked my code and I found another way to get Y angle, which might be a little bit faster:
var angle=(v1 * Vector3(1,0,1)).angle_to(v2 * Vector3(1,0,1))
If you cache
Vector3(1,0,1) in a constant, it should be faster than creating 2d vectors while calling getters from 3d vectors in a script. Alas I couldn't measure it.
And if you don't want to compare a vector to another but just want to know the angle relative to the vector of reference (which is always at 0°. I usually use the Z axis), you can cache this vector too. For instance, if Z is the reference vector, you can write:
var angle=Vector3(0,0,1).angleto(myvector * Vector3(1,0,1))