Here's my comparison as I had the same situation.
GraphQL Subscriptions - Give updates when the data changes. It can triggered when a mutation takes place in your GraphQL server. This is great as it keeps your logic tightly coupled. However, in the use case of a "Chat" application. This isn't the best.
Socket.IO - Provides a 2 Way Event notification services. Therefore, you can send event from the clients without waiting on a GraphQL mutation to be executed. For example: "User A is Typing..." Or a User enters or leaves the conversation.