I think proto3 was intended to be simpler -- an evolution of protobuf in a direction that is more refined and elides superfluous features. Eventually (though not likely any time soon), support for proto2 will go away.
The main omission in proto3 that I personally felt strongly about was the lack of preserving unknown fields. But that functionality has been restored for many languages/runtimes in 3.5 (and coming soon, hopefully, for Go and the others).
All of the other omissions in proto3 have alternate solutions/work-arounds that aren't baked into the language (like wrapper types and Any), which shows that these features didn't truly need to be language features to begin with. So it allows the language itself to remain simple, which means libraries/tooling are simpler to build on top.
So a big advantage of proto3 is simplicity (and for some languages/runtimes, that will translate into improved performance). And another advantage is future compatibility (since, in all likelihood, proto2 will eventually go away.)
If creating new files, it makes sense to use proto3. If you already have a corpus of proto2 files, a reasonable migration path forward is to start evolving them to proto3 (or, if the languages/runtimes you use don't yet preserve unrecognized fields, wait for that functionality to be fully implemented everywhere and then start evolving).
- Make required fields optional. Required fields have always been dangerous. If a field is required in your protocol, it can be enforced in application code instead of in the de-serialization logic of the protobuf runtime.
- Use Any instead of extensions. An extension range can generally be replaced with a repeated Any field. Extensions with scalar types will have to be "boxed" into single-field messages.
- Use wrapper types for scalar fields where absence must be distinguishable from zero.
- Usages of default values can be changed to use wrapper types and application logic that decides non-zero values to use when the field is not present.
- Groups should be replaced with nested messages.
Once a file is no longer using any proto2 features, it can be changed to proto3 syntax. Unfortunately, there is not yet a way to incrementally move to proto3. Once you change the syntax of the file, the generated code will change, and all clients of that generated code must be changed atomically in order to compile (at least for languages/runtimes where generated code for the two syntaxes is materially different/incompatible). I would hope that this is something that will be addressed in future versions of protobuf, to facilitate migrations away from proto2.