Webnodes are what the path finder uses to path to a certain location when you use Walking.walk from a distant location. Let's say you're in Lumbridge and want to walk to Entrana. The web path finder will create a path that the bot can walk along that'd use a series of basic web nodes and charter web nodes. The bot will initially path you to the boat via a bunch of basic web nodes until it reaches the boat. The CharterWebNode will have the functionality to handle talking to the monk, or, selecting the "Travel" action within its "execute" method. It can also handle any sleeps necessary to wait until it's done traveling before it starts trying to walk again. This is what makes these specialized webnodes very powerful. Without CharterWebNode's, you would have to hard code a sequence of events to walk to the destination. First, you'd have the bot walk to the monks by specifying a tile or area, then have some code where it'd talk to or select travel, then walk across the plank (the local path finder does this), finally you'd have to walk to the final destination in entrana.
You should use custom web nodes when you're trying to walk to areas that are not mapped within the global list of web nodes, or if a web node doesn't have the functionality you desire. For example, when making a barrows script, you need to dig on the mounds to go inside the crypts. There are no global web nodes that handle this, and to prevent hard coding a sequence of events, I needed to make an EntranceWebNode to handle the walking on the mound and digging for each mound. This involved making a CryptEntranceNode (extends EntranceWebNode with custom functionality in the execute method) on the mound, an EntranceWebNode for the crypt stairs, and a BasicWebNode in the center of the crypt. Then, all I need to do is call Walking.walk(centerCryptTile) and the nodes+pathfinder will take care of everything.
Additionally, there were some global nodes inside the maze but they didn't have the functionality that I wanted. I wanted to call Walking.walk(mazeCenterTile) and let the walker do all the work. However, due to how the global web nodes were set up, the walker relied heavily on the LocalPathFinder to deal with the doors and it led to unwanted behavior. What I did was make a MazeDoorNode that extends BasicWebNode and set its isValid method to return true if the doors have an "open" action. That way, the web nodes within the crypt will create an inherent path to the center of the maze and all I needed to to was call Walking.walk(mazeCenterTile). The local path finder handles the doors while the web finder handles the pathing to the center.
Edit:
Another recent web node I needed to create was a teleport web node for the crafting guild since there are none in the global web node. I created it almost exactly the same way Luxe did with his farming cape example. All I need to do is call Bank.open(BankLocation.CRAFTING_GUILD) and it will use the crafting cape to teleport while Bank.open walks to the bank.