When do I need a contextual filter vs. a relationship?

  A relationship is a join.

  Accept Just think of it terms of SQL:
  a ‘relationship’ is a JOIN on another table
  a ‘filter’ (contextual or not) is a WHERE clause.
  ‘Contextual’ just means the parameter comes from the current context, e.g. part of the URL, something in the session,

  I think you described it well yourself. A relationship is a join. You are joining another table to the base table for the view you are creating. A contextual filter is an argument you are passing to the query created by the view.