It will always be slow if contacting a live node for data such as account balance.

My preferred way is to use [Amberdata](https://amberdata.io/dashboards/applications?utm_source=stackoverflow&utm_medium=link)'s [API](https://web3api.io/api-explorer/) which is much faster. All you need is [an api key](https://medium.com/amberdata/access-the-best-ethereum-data-with-a-simple-api-key-52aaa2537dc0) then you can: 

    curl \
        -X GET \
        -H "accept: application/json" \
        -H "x-amberdata-api-key: your-api-key" \
        -H "x-amberdata-blockchain-id: 1c9c969065fcd1cf" \
    "https://web3api.io/api/v1/addresses/0xb7e3abd75119fe3cfc76015193226b21fc19230b/statistics"

Which will return the data like so: 

    {
      "status": 200,
      "title": "OK",
      "description": "Successful request",
      "payload": {
        "balance": "9740560000000000",
        "balanceIn": "271223036960000000000",
        "balanceOut": "271213296400000000000",
        "addressType": "address",
        "contractType": [
          "Unknown"
        ],
        "numHolders": "0",
        "numTransfers": null
      }
    }

Let me know if that works for you! 😃

EDIT:

There is also a [node wrapper package](https://github.com/web3data/web3data-js)!