Web Application to Salesforce
You don't state the technology your web application is built with, however the Salesforce REST and SOAP API's provide a full CRUD based API to the data in Salesforce, such that you can use these API's to callout from the appropriate place in your code.
Salesforce to Web Application
The Salesforce Streaming API is not ideal for your requirements since Salesforce cannot guarantee delivery, the following extract from the documentation confirms this.
Streaming API doesn’t guarantee durability and reliable delivery of notifications. Streaming servers don’t maintain any client state and don’t keep track of what’s delivered. The client may not receive messages for a variety of reasons
Outbound Messages are linked with the Workflow engine, which only covers insert and update, not delete. They are more real time, though some conditions exist where messages can be dropped, see the Understanding Notifications subsection for more details.
The most reliable way that i have read about, which is actually designed for your use case is the Replication API. Though this is not real time however, though it does give access to records created, updated and deleted within the last polled time frame. You could run a service in your web application to periodically make these replication API calls.
The API supports data replication, which allows you to store and maintain a local, separate copy of your organization’s pertinent Salesforce data for specialized uses, such as data warehousing, data mining, custom reporting, analytics, and integration with other applications. Data replication provides you with local control and the ability to run large or ad hoc analytical queries across the entire data set without transmitting all that data across the network.
Note that Apex supports HTTP callouts to REST/SOAP API's on external servers, such that you might think Apex Triggers (called at the db level) can be used. However the HTTP callouts cannot be made from this context. Requiring the use of Async Apex, this in itself presents reliability issues (what happens if your web service fails?).
Finally you could consider overriding the UI for the Account entry with a Visualforce page and thus make the HTTP callout from an Apex Controller. However this option does not actually help if Accounts are created or updated from the Salesforce API or via the native UI, however if either of these routes can be excluded from the requirements this might be your best bet.
You may also find this question and answer a useful read, What is the best approach to call a webservice from SFDC?.
Additional Questions
Q: Is the replication API method good for multiple users trying to sync the data simultaneously?
A: The API will only return records that are visible to the user the API is logged in as, so make sure your API user has enough privileges to see the records you want to
replication.
Q: Can a salesforce user invoke changes ? i mean can the changes be brought from my application's db by clicking on any button like "get changes from my application" ?
A: If your Web Application exposed a REST/SOAP API you could call this from a Custom Button in Salesforce to accomplish this. However this is a code solution, you there is no built in button to do this.
Q: Can we add new fields to the existing objects like contacts etc?
A: Yes you can, it is a key feature of Salesforce, the ability extending existing objects with custom fields.
Best Answer
You have all the right resources, as mentioned in the blog
This is based on the OAuth flow, More details on the approach here
To access these reports programmatically we would need the access token, we can route the requests either with one access token or per user (Security is a different topic)
Once you have setup the classes and visualforce page in Salesforce, copy the visualforce page URL which will be in this format: https://xxxxx-dev.my.salesforce.com/apex/powerbireport
Now you have to register this URL as mentioned here:
You will get Application Id and Application secret, copy over these values and follow the blog instructions to put it in custom settings,
Note: Storing Application Id and secret in custom setting is not a good approach.