No overlapping timestamp with condition
You can add a WHERE clause to the constraint, making it a partial one. It will be checked only for row that have deleted IS NULL. Rows that have deleted populated will be completely ignored by the constraint checks:

ALTER TABLE foo
    ADD CONSTRAINT no_overlapping_times_for_event_type EXCLUDE
    USING gist (event_type WITH =, tstzrange("from", "to", '[)') WITH &amp;&amp;)
    WHERE (deleted IS NULL) ;