Fundamentally, using an asynchronous method call will not block the thread, which is a finite resource on any machine. Let's say you have a method call that might take 3 seconds to complete due to network latency, heavy database workload, etc. If you call this method synchronously, your thread is actually sitting there waiting for the results to come back, oblivious to the rest of your application.
Asynchronous method calls (or async/await, as it's colloquially known and called) are non-blocking. So if your executing thread encounters a method that indicates it can be awaited, it will (and I'm vastly oversimplifying things here) put a flag in the sand and tell the system to just do the thing and give me a call when you're done.
Now you're probably thinking, "But wait! Doesn't that mean another thread has to do the job the current thread just delegated?!" and you'd be correct.
This is where the concept of foreground and background threads comes in. An example of a foreground thread would be something like the thread handling a web API call in the controller, or a UI rendering thread.
Blocking these threads is detrimental for several reasons, in the case of API threads you're basically narrowing the window of how many requests per second you can handle at any given time. In the UI case, it might stall the rendering for several seconds while it's doing work in the background.
So what are the positives and negatives in general? You're distributing your thread workload more evenly when using async/await, at the detriment of memory overhead (something's going to have to remember where all the flags in the sand are, and keep track of when the process can continue).
When people say it's making the application more performant, this is true by making it more concurrent, but not necessarily faster.
To address the comment left by Mihir Dave:
Misuse of async/await would include trying to apply it to pure computational methods (eg. no I/O, purely CPU bound). At that point you're adding a lot of complexity and overhead for no benefit. Another bad application is not embracing it top to bottom, if you start trying to "syncify" async methods, or "asyncify" sync methods, the risk for deadlocks increases dramatically. The latter is quite common when working with outdated APIs, that may not expose async methods.
An extensive read about async/await read would be Q: why-shouldnt-all-functions-be-async-by-default