To solve this optimization problem, we need to define the decision variables and the objective function. Let's denote the number of vehicle tickets as $v$ and the number of passenger tickets as $p$. The profit made from selling each type of ticket is given, with $130 for each vehicle ticket and $60 for each passenger ticket.

The constraints are:
1. The total number of tickets sold cannot exceed 200: $v + p \leq 200$.
2. At least 20 tickets must be reserved for vehicles: $v \geq 20$.
3. At least four times as many tickets are sold for passengers as for vehicles: $p \geq 4v$.

The objective function to maximize profit is: $130v + 60p$.

Now, let's translate these into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("Boat_Company_Profit")

# Define the decision variables
v = m.addVar(name='vehicle_tickets', vtype=GRB.INTEGER, lb=0)
p = m.addVar(name='passenger_tickets', vtype=GRB.INTEGER, lb=0)

# Add constraints
m.addConstr(v + p <= 200, name='total_tickets')
m.addConstr(v >= 20, name='min_vehicle_tickets')
m.addConstr(p >= 4 * v, name='passenger_to_vehicle_ratio')

# Objective function: Maximize profit
m.setObjective(130 * v + 60 * p, GRB.MAXIMIZE)

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found. Vehicle tickets to sell: {v.x}, Passenger tickets to sell: {p.x}")
    print(f"Maximum profit achievable: ${130 * v.x + 60 * p.x}")
else:
    print("No optimal solution found. The problem might be infeasible.")
```