Promises are used when you are doing an operation that is expensive and relatively time-consuming. For example, if you were doing a intensive query on a database, you don't want to leave your front end user waiting while you collect all the records.
In such cases, you would return a Promise instead of a Result. This will stop the front-end from hanging due to it waiting for a response for an intensive computation. It will receive the actual result once the computation is complete.
Promises are run in a separate thread, so only use them when necessary. In most cases, you just need to use a Result.
There is a good page in the Play! Framework documentation that talks all about Asynchronous HTTP programming:
A Promise will eventually be redeemed with a value of type Result. By using a Promise instead of a normal Result, we are able to return from our action quickly without blocking anything. Play will then serve the result as soon as the promise is redeemed.
If you need to stream data, I would also take a look at EventSource (For server sent events) or WebSockets. I would also recommend looking at the latest release of Play (2.3) and getting Java 8 to take advantage of Lambda Expressions, which will reduce the verbosity of code. You can take a look at some examples on Typesafe here.
Oh, and it does look like you are overusing Promises. You only need them if you are doing a computation that is expensive in time and computational resources. Again, if your code is looking unreadable due to anonymous inner classes and functions, I would highly recommend upgrading to Java 8 and using Lambda Expressions.