I use union types for errors - but only on mutation results not normal queries. One challenge we had with customers is that if a mutation fails, they still get back a 200 response - because an error type is a valid response. So we’ve had cases were people weren’t checking the response and assumed that a 200 OK meant the mutation worked - which I don’t think is a bad assumption.
We have an item on our backlog to look into returning 400/500s based on the query result