The distinction that holds up in practice: channels pass ownership, mutexes protect state.
Use a mutex when goroutines share a data structure and each just needs exclusive access briefly — a cache, a counter, a connection pool. A channel there adds a goroutine and a hop for no benefit.
Use a channel when a value moves from one goroutine to another — a work queue, a pipeline stage, a cancellation signal. The channel is the handoff, and after it the sender must not touch the value.
If you find yourself using a channel of size one as a lock, you wanted a mutex.