Another way to think of the differences is this - an entity can be in only one project, but can have multiple tags. Projects let you group a body of work. Since around version 8.0, you can create a project, and any subsequent entities you create will be placed in it by default. This makes it harder to forget to put an entity in a project, or put a tag on it. It groups pieces of work like an IDE would group classes in a Java project.
Tags can be applied at will. If you have an entity that's used by several applications in ThingWorx, you can give it tags for each of them. For example, a Thing could have, "Application:AwesomeDemo, Application:UsefulProdApp, RetailApps:App1, ... " tags. Using tags, you could do exports of subsets of entities such that those exports shared things, but didn't consist of the same things.
The concepts are similar, but tags give you the flexibility to go from a 1...n relationship to an n...n relationship. Projects represent hierarchical organization, while tags represent bottom-up, emergent order.