First let's get the fundamentals sorted.
You connect to a blockchain through a node which implements the blockchain. So a node is a client program which runs code that makes up the blockchain - the blockchain consists of nodes. There is no way to connect to the blockchain without a node (be it yours or somebody else's).
So a dapp uses some web3 library (for convenience) to connect to some node which in turns is a part of the blockchain and can therefore interact with it.
One of the main aspects of blockchains is decentralization. So nobody controls it and everyone can run a node and connect to it.
Now for actual answers:
1) Using a centralized entity (for example Infura or whatever "web3 API" as you say) is, well, centralized. You are dependent on the service/API provider. If they go down you lose your access and you either have to switch provider or start running your own node. Or they may get compromised and whatever. Furthermore, we need this infrastructure because there is no other way to connect with the blockchain.
2) Running your own node can be rather cumbersome. There are certain hardware requirements and you need to keep the node client code up to date (for example upon a hard fork you have to have the latest client version to be able to mine the new chain). But if you run your own node you are not dependent on anyone else - and you can't blame anyone else but yourself for any downtime. I don't think there are big performance variations between any of the solutions and it wouldn't make much difference anyway as most of the time is spent waiting for mining. So using ready providers is much easier and faster to set up but you may lose a part of your soul in the process.