Can panelizer automatically switch layouts based on a condition? For a new project I'm starting, Panels+Panelizer seems a very good fit, but I'm still figuring out how to do some advanced things with it.

I like the fact that you can define the default layout and content panes for a certain node type, and allow the editor to override the default panes per node.

In some cases I want the layout and content panes to be dependent on certain conditions. For instance, if the date field on a node is not empty, I want a calendar pane in the right column; otherwise I want a 'related news' pane.

I have read about visibility rules, but the options seem rather limited (eg. there is no "not empty" condition for fields) and it does not allow you to change the layout completely. Which other methods exist make the default layout and content panes depend on certain conditions (other than the node type)?
Visibility rules are the way to go.

Granted the built in ones are not always as sophisticated as one might like at times, but on the other hand, access plugins are among the easiest to do on your own, allowing you arbitrary conditions.

See What are Ctools plugin (content type, access, etc), and how does one create them? for a example of how to implement one.

It can also be worthwhile checking the Ctools issue queue for a plugin that matches your requirements. Development of Ctools has almost gone away with all the active contributors working on D8 instead, but I have found useful patches in the queue.