why don't you use vec_rotate()?

euler angles are the most intuitive representation to humans and in many cases they work just fine. if you do something like a space ship simulator where you always have arbitrary rotations about 3 axes at the same time then you have to use something else since euler angles will cause gimbal lock.