Many devs use the op_return in Bitcoin to store some arbitrary data. In Monero, is the payment ID the equivalent?
Arbitrary data can be stored in the extra field in a Monero transaction. The payment ID uses the extra field, and is often used as a container for arbitrary data, because it is easy to use. However, it is (1) limited in size and (2) sometimes required by the recipient. For more flexible use, having a custom field in extra seems best. However, this will require the sender and recipient (or sender and the target population at large) to agree on the semantics of that extra data in the first place, so that it can be parsed and understood. The amount of data which can be placed in the extra field is limited by the maximum block size.