How can I deal with crossing wires when designing a PCB?

You can use vias to move a trace from top to bottom and back again. That's like your "jump the trace from top to bottom solution." That's the usual way of handling crossings - make one trace go below the other.

What you really need to do is to move your parts around and rotate them to minimize the number of crossings before you start routing.

  • Use the entire bottom side as ground. Try to keep it in one large piece. Anything you run on the bottom to get around a crossing should be as short as possible.
  • You have audio and fast digital stuff on there. Try to keep the traces for the two types of signals away from one another.
  • Group your parts so as to minimize crossings, even if it offends your sense of organization/aesthetics.
  • Group your parts so as to keep digital stuff and analog stuff separate. When in doubt, keeping analog and digital seperate is more important than minimizing crossings.
  • Use vias to connect all ground connections straight down to the ground plane on the back side.
  • You can pretty much ignore the ground connections until the very end. Route all of your signal lines and power traces, then pour the ground plane on the back. Drop the ground connections to the ground plane with vias.

One strategy that was more common with older designs is to route traces vertically on one side and horizontally on the other. This method will likely need more vias than if you don't follow this pattern but it keeps things organized and can greatly improve the density of traces you can fit in one area. Here's a picture of a section of a board I designed recently that uses this strategy. Of course this also prevents you from using the bottom as a complete ground plane, makes the lines longer and more inductive, and has other cons too so it's not appropriate for every application, but works nicely for low frequency and low power projects with a lot of connections.

Red (front) traces move vertically. Green (back) traces move horizontally.

Also, as JRE mentioned, arranging elements carefully to minimize trace length makes a world of difference.