If it's never Visible, I don't really care if it Exists, and if it is Visible, then it has to already Exist.
Unfortunately, for me it is not as straightforward as you described.
Sometimes (let's say, to quit the app between tests) I need to perform different actions based on what exact screen is visible, so the logic is: if this one is visible, click that button, if another one - click another and so on. I cannot rely on the expected app state based on the last step since the test can fail somewhere in the middle and TE will not be able to quit the app and proceed with tests. I cannot Terminate the app, since I have other processes to quit, which happens with regular quit of my app via UI actions.
To implement that first I started with Visible only, but I got error kinda 'You are trying to get a property Visible of an element that does not exist'. I did not want that error, because for me it is not actually an error, I expect that element can be absent on screen. And I am OK with that. I perform specific verification of element visibility if needed.
So the best working decision I was able to implement to meet all my possible scenarios and avoid unnecessary errors: first check if an element Exists, and only after that (if it Exists) I am checking if an element is visible.